225
7.3 Niveaux d’isolation de la transaction
les lignes en cours de modification, ce qui lui garantit une lecture cohérente de l’état
de ces données, avant modification. Expérimentons-le :
USE sandbox;
GO
CREATE TABLE dbo.testSnapshot
(nombre int, texte varchar(50) COLLATE French_BIN);
GO
INSERT INTO dbo.testSnapshot VALUES (1, 'un');
INSERT INTO dbo.testSnapshot VALUES (2, 'deux');
INSERT INTO dbo.testSnapshot VALUES (3, 'trois');
INSERT INTO dbo.testSnapshot VALUES (4, 'quatre');
GO
-- session 1
BEGIN TRAN;
UPDATE dbo.testSnapshot
SET texte = 'DEUX'
WHERE nombre = 2;
-- session 2
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT *
FROM dbo.testSnapshot
WHERE nombre = 2;
La deuxième session lit sans problème la ligne. La valeur retournée pour la
colonne texte est 'deux', et non 'DEUX', comme ce serait le cas dans une lecture en
niveau d’isolation READ UNCOMMITTED : la valeur lue est la version de la ligne précédant la modification, par la ligne en cours de modification.
Vous pouvez voir les versions de lignes en cours à l’aide des vues de gestion dynamique sys.dm
tran
active
snapshot
database
transactions et
sys.dm_tran_version_store. sys.dm tran active snapshot database transactions
donne le spid (session_id) et la durée en secondes depuis la création de la version
(elapsed_time_seconds), sys.dm_tran_version_store vous retourne une ligne par
version de ligne, avec l’indication de la base de données (database_id) source.
Attention aux requêtes sur sys.dm_tran_version_store : elles peuvent impacter les
performances, compte tenu de l’importante quantité de résultats qu’elles peuvent
retourner.
Une lecture dans ce niveau génère aussi une version :
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN;
SELECT *
FROM dbo.testSnapshot
7.3 Niveaux d’isolation de la transaction
les lignes en cours de modification, ce qui lui garantit une lecture cohérente de l’état
de ces données, avant modification. Expérimentons-le :
USE sandbox;
GO
CREATE TABLE dbo.testSnapshot
(nombre int, texte varchar(50) COLLATE French_BIN);
GO
INSERT INTO dbo.testSnapshot VALUES (1, 'un');
INSERT INTO dbo.testSnapshot VALUES (2, 'deux');
INSERT INTO dbo.testSnapshot VALUES (3, 'trois');
INSERT INTO dbo.testSnapshot VALUES (4, 'quatre');
GO
-- session 1
BEGIN TRAN;
UPDATE dbo.testSnapshot
SET texte = 'DEUX'
WHERE nombre = 2;
-- session 2
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT *
FROM dbo.testSnapshot
WHERE nombre = 2;
La deuxième session lit sans problème la ligne. La valeur retournée pour la
colonne texte est 'deux', et non 'DEUX', comme ce serait le cas dans une lecture en
niveau d’isolation READ UNCOMMITTED : la valeur lue est la version de la ligne précédant la modification, par la ligne en cours de modification.
Vous pouvez voir les versions de lignes en cours à l’aide des vues de gestion dynamique sys.dm
tran
active
snapshot
database
transactions et
sys.dm_tran_version_store. sys.dm tran active snapshot database transactions
donne le spid (session_id) et la durée en secondes depuis la création de la version
(elapsed_time_seconds), sys.dm_tran_version_store vous retourne une ligne par
version de ligne, avec l’indication de la base de données (database_id) source.
Attention aux requêtes sur sys.dm_tran_version_store : elles peuvent impacter les
performances, compte tenu de l’importante quantité de résultats qu’elles peuvent
retourner.
Une lecture dans ce niveau génère aussi une version :
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN;
SELECT *
FROM dbo.testSnapshot
