Obtenir des données non engagées dans MySQL

SQL Server nous pouvons écrire ci-dessous SQL Queries pour obtenir des données non-engagées dans la base de données . Cela signifie que les données qui sont toujours en cours de transaction et la Transaction n'est pas complète.

requête SQL Server

Select * from TableName With(NoLock);

y a-t-il une équivalence dans la base de données MySQL pour obtenir des données même si la table est verrouillée ? Je suis en train d'essayer cela en PHP CodeIgnitor

14
demandé sur Pankaj 2015-11-26 00:15:21

5 réponses

Trouvé un article avec le titre " syntaxe MySQL NOLOCK"

http://itecsoftware.com/with-nolock-table-hint-equivalent-for-mysql

SQL Server (NOLOCK) ressemble à ceci:

SELECT * FROM TABLE_NAME WITH (nolock)

pour obtenir la même chose avec MySQL, nous changeons le mode d'isolation de la session en utilisant le SET SESSION la commande.

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
 SELECT * FROM TABLE_NAME ;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;

Vous pouvez réaliser même par ci-dessous:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;

cet énoncé fonctionnera de la même façon que AVEC (NOLOCK) j'.e READ UNCOMMITTED données. Nous pouvons également définir le niveau d'isolement pour toutes les connexions à l'échelle mondiale:

 SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;

en outre, deux variables système liées au niveau d'isolement existent aussi dans MySQL server:

SELECT @@global.tx_isolation; (global isolation level)
SELECT @@tx_isolation; (session isolation level)

ou définissez le niveau d'isolement à l'intérieur d'une transaction:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO

dans l'allumeur de code vous pouvez envelopper votre requête avec deux premières solutions ou vous pouvez utiliser l'option globale.

pour votre référence, vous pouvez utiliser ci-dessous code:

$this->db->query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE");
$this->db->trans_start();

// your code

$this->db->trans_complete();

mise à Jour 1:

vous pouvez simplement définir le niveau d'isolement dans une requête avant d'exécuter vos instructions. Ci-dessous est le code simple PHP mysqli tu utiliser isolation level read uncommited

//db connection
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');

//set isolation level
$mysqli->query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");

//your Select Query
$results = $mysqli->query("SELECT * FROM tablename");


while($row = $results->fetch_assoc()) {
    //some statements
}

// Frees the memory associated with a result
$results->free();
$mysqli->query("COMMIT");
// close connection
$mysqli->close();
9
répondu Chetan Ameta 2015-12-16 06:29:46
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;

Référence

4
répondu Pankaj 2015-12-14 03:34:07

les instructions SELECT sont exécutées de manière non-bloquante, mais une version antérieure possible d'une rangée pourrait être utilisée. Par conséquent, en utilisant ce niveau d'isolement, ces lectures ne sont pas cohérentes. Il est également appelé une lecture sale. Sinon, ce niveau d'isolement fonctionne comme READ COMMITTED.

SERIALISABLE

ce niveau est comme read reproductible, mais InnoDB convertit implicitement toutes les instructions simples SELECT à SELECT ... Bloquez le MODE de partage si autocommit est désactivé. Si autocommit est activé, le SELECT est sa propre transaction. Il est donc connu pour être lu seulement et peut être sérialisé si effectué comme une lecture (non-verrouillage) cohérente et n'a pas besoin de bloc pour les autres transactions. (Pour forcer un simple SELECT à bloquer si d'autres transactions ont modifié les lignes sélectionnées, désactivez autocommit.)

validation

Command-Line Format --autocommit[=#]
System Variable Name    autocommit
Variable Scope  Global, Session
Dynamic Variable    Yes
Permitted Values    Type    boolean
Default ON

le mode autocommit. Si défini à 1, Tous les changements à une table prennent effet immédiatement. Si défini à 0, Vous devez utiliser COMMIT pour accepter une transaction ou d'annuler pour l'annuler. Si autocommit est 0 et que vous le changez en 1, MySQL effectue une propagation automatique de toute transaction ouverte. Une autre façon de commencer une opération est d'utiliser une opération initiale ou un énoncé de début. Voir Section 13.3.1, "START TRANSACTION, COMMIT, and ROLLBACK Syntax".

par défaut, les connexions client commencent avec autocommit réglé à 1. Pour que les clients commencent par un défaut de 0, définissez la valeur globale autocommit en démarrant le serveur avec le -- autocommit=0 option. Pour définir la variable à l'aide d'un fichier d'options, inclure ces lignes:

[mysqld]
autocommit=0

Voir aussi

1
répondu Alaa M. Jaddou 2015-12-11 18:42:02

dans le Code igniter, vous pouvez utiliser la commande suivante avant toute requête:

$this->db->simple_query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");

Vous pouvez obtenir plus d'informations sur niveau D'isolation MySQL dans la documentation. Cela nécessite innoDB tables.

Pour plus d'informations sur simple_query() selon CodeIgniter documentation, il est utilisé lorsqu'une requête ne renvoie aucun résultat.

1
répondu Adam 2015-12-14 22:04:12

seul le moteur de stockage InnoDB supporte complètement les transactions. Il implémente également le MVCC de style Oracle/PostgreSQL qui empêche les verrous de ligne implicites de bloquer les lectures. To get Read-un committed in InnoDB, issue a SET TRANSACTION LEVEL READ UNCOMMITTED avant d'émettre la requête.

La syntaxe pour le faire en PHP ressemblerait à quelque chose comme ceci:

$dbh->exec('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
$dbh->beginTransaction();

définit le niveau d'isolement jusqu'à la prochaine COMMIT ou ROLLBACK. Pour faire le changement de niveau persistent pendant toute la durée de la session, utilisez

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

à la place.

quant à l'annulation d'un verrou de lecture non-sharing sur une table ou une rangée, Je ne suis pas sûr que ce soit possible, et je ne peux pas non plus penser à une situation où ce serait souhaitable. Les serrures sans partage sont généralement non-partage pour une raison.

1
répondu Darwin von Corax 2015-12-15 01:23:36