Microsoft SQL Server
Niveaux d'isolation des transactions
Recherche…
Syntaxe
- SET ISOLATION LEVEL {READ UNCOMMITTED | LIRE ENGAGÉ | REPEATABLE READ | SNAPSHOT | SERIALIZABLE} [; ]
Remarques
Référence MSDN: SET NIVEAU D'ISOLATION DE TRANSACTION
Lire non engagé
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
C'est le niveau d'isolement le plus permissif, en ce sens qu'il ne provoque aucun blocage. Il spécifie que les instructions peuvent lire toutes les lignes, y compris celles qui ont été écrites dans des transactions mais pas encore validées (c'est-à-dire qu'elles sont toujours en transaction). Ce niveau d'isolement peut être sujet à des "lectures incorrectes".
Lire commise
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Ce niveau d'isolement est le deuxième plus permissif. Il empêche les lectures sales. Le comportement de READ COMMITTED
dépend du paramétrage de READ_COMMITTED_SNAPSHOT
:
Si cette option est définie sur OFF (paramètre par défaut), la transaction utilise des verrous partagés pour empêcher les autres transactions de modifier les lignes utilisées par la transaction en cours et pour empêcher la transaction en cours de lire les lignes modifiées par d'autres transactions.
S'il est défini sur ON, l'
READCOMMITTEDLOCK
tableREADCOMMITTEDLOCK
peut être utilisé pour demander un verrouillage partagé au lieu du contrôle de version de ligne pour les transactions exécutées en modeREAD COMMITTED
.
Remarque: READ COMMITTED
est le comportement par défaut de SQL Server.
Que sont les "lectures sales"?
Les lectures sales (ou les lectures non validées) sont des lectures de lignes qui sont modifiées par une transaction ouverte.
Ce comportement peut être répliqué à l'aide de deux requêtes distinctes: une pour ouvrir une transaction et écrire des données dans une table sans être validée, l'autre pour sélectionner les données à écrire (mais pas encore validées) avec ce niveau d'isolation.
Requête 1 - Préparez une transaction mais ne la terminez pas:
CREATE TABLE dbo.demo (
col1 INT,
col2 VARCHAR(255)
);
GO
--This row will get committed normally:
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (99, 'Normal transaction');
COMMIT TRANSACTION;
--This row will be "stuck" in an open transaction, causing a dirty read
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (42, 'Dirty read');
--Do not COMMIT TRANSACTION or ROLLBACK TRANSACTION here
Requête 2 - Lisez les lignes, y compris la transaction ouverte:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.demo;
Résultats:
col1 col2 ----------- --------------------------------------- 99 Normal transaction 42 Dirty read
PS: n'oubliez pas de nettoyer ces données de démonstration:
COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO
Répétable Lire
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
Ce niveau d'isolation de transaction est légèrement moins permissif que READ COMMITTED
, dans la mesure où les verrous partagés sont placés sur toutes les données lues par chaque instruction de la transaction et sont conservés jusqu'à la fin de la transaction .
Remarque: utilisez cette option uniquement lorsque cela est nécessaire, car il est plus susceptible de provoquer une dégradation des performances de la base de données et des blocages que READ COMMITTED
.
Instantané
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Indique que les données lues par une instruction dans une transaction seront la version cohérente sur le plan des transactions des données qui existaient au début de la transaction, c.-à-d. Qu'elles ne liront que les données validées avant le début de la transaction.
SNAPSHOT
transactions SNAPSHOT
ne demandent ni ne provoquent de verrous sur les données en cours de lecture, car elles ne lisent que la version (ou l'instantané) des données qui existaient au début de la transaction.
Une transaction s'exécutant au niveau d'isolement SNAPSHOT
, en lecture seule, ses propres modifications de données en cours d'exécution. Par exemple, une transaction peut mettre à jour certaines lignes, puis lire les lignes mises à jour, mais cette modification ne sera visible que par la transaction en cours tant qu'elle n'est pas validée.
Remarque: L'option de base de données ALLOW_SNAPSHOT_ISOLATION
doit être définie sur ON avant que le niveau d'isolement SNAPSHOT
puisse être utilisé.
Sérialisable
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE
Ce niveau d'isolement est le plus restrictif. Il demande une plage verrouille la plage des valeurs de clé lues par chaque instruction dans la transaction. Cela signifie également que les instructions INSERT
des autres transactions seront bloquées si les lignes à insérer se trouvent dans la plage verrouillée par la transaction en cours.
Cette option a le même effet que de définir HOLDLOCK
sur toutes les tables de toutes les SELECT
d'une transaction.
Remarque: Cet isolement de transaction a la plus faible concurrence et ne doit être utilisé que lorsque cela est nécessaire.