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é

SQL Server 2008 R2
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

SQL Server 2008 R2
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 table READCOMMITTEDLOCK peut être utilisé pour demander un verrouillage partagé au lieu du contrôle de version de ligne pour les transactions exécutées en mode READ 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

SQL Server 2008 R2
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é

SQL Server 2008 R2
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

SQL Server 2008 R2
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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow