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
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();
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
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.
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.