224
Chapitre 7. Transactions et verrous
Les deux requêtes sur la vue sys.dm_tran_locks ne sont pas incluses dans le code
pour des raisons de place, vous les connaissez. Leur résultat est visible dans la
figure 7.3 pour le premier cas (heap sans index), et dans la figure 7.4 pour le second
cas (heap avec index nonclustered).
Figure 7.3 — Verrous sur un heap
Figure 7.4 — Verrous sur une table clustered
Vous pouvez voir que dans le premier cas SQL Server n’a d’autre choix que de
poser un verrou exclusif sur la table. Par contre, lorsqu’un index existe, il peut poser
des verrous d’étendues sur les clés de l’index qui devraient être accédées si se produit
un ajout de ligne répondant à la clause nombre = 2. Les verrous sont des RangeS-U :
partagé sur l’étendue, mise à jour sur la ressource. Un Intent Update est posé sur la
page de l’index.
N’utilisez le niveau SERIALIZABLE qu’en cas d’absolue nécessité (changement ou
calcul de clé, par exemple), et n’y restez que le temps nécessaire. Le verrouillage
important entraîne une réelle baisse de concurrence.
Le niveau d’isolation SNAPSHOT existe depuis SQL Server 2005. Il permet de diminuer le verrouillage, tout en offrant une cohérence de lecture dans la transaction.
Alors que dans le niveau READ UNCOMMITTED, des lectures sales restent possibles, le
niveau SNAPSHOT permet de lire les données en cours de modification, dans l’état
cohérent dans lequel elles se trouvaient avant modification. Pour cela, SQL Server
utilise une fonctionnalité interne appelée version de lignes (row versioning). Pour
pouvoir l’utiliser, le support du niveau d’isolation SNAPSHOT doit avoir été activé dans
la base de données. Exemple :
ALTER DATABASE sandbox SET ALLOW_SNAPSHOT_ISOLATION ON
Quand ceci est fait, toutes les transactions qui modifient des données dans cette
base, maintiennent une copie (une version) de ces données avant modification,
dans tempdb, quel que soit leur niveau d’isolation. Si une autre session en niveau
d’isolation SNAPSHOT essaie de lire ces lignes, elle lira la copie des lignes, et non pas
Chapitre 7. Transactions et verrous
Les deux requêtes sur la vue sys.dm_tran_locks ne sont pas incluses dans le code
pour des raisons de place, vous les connaissez. Leur résultat est visible dans la
figure 7.3 pour le premier cas (heap sans index), et dans la figure 7.4 pour le second
cas (heap avec index nonclustered).
Figure 7.3 — Verrous sur un heap
Figure 7.4 — Verrous sur une table clustered
Vous pouvez voir que dans le premier cas SQL Server n’a d’autre choix que de
poser un verrou exclusif sur la table. Par contre, lorsqu’un index existe, il peut poser
des verrous d’étendues sur les clés de l’index qui devraient être accédées si se produit
un ajout de ligne répondant à la clause nombre = 2. Les verrous sont des RangeS-U :
partagé sur l’étendue, mise à jour sur la ressource. Un Intent Update est posé sur la
page de l’index.
N’utilisez le niveau SERIALIZABLE qu’en cas d’absolue nécessité (changement ou
calcul de clé, par exemple), et n’y restez que le temps nécessaire. Le verrouillage
important entraîne une réelle baisse de concurrence.
Le niveau d’isolation SNAPSHOT existe depuis SQL Server 2005. Il permet de diminuer le verrouillage, tout en offrant une cohérence de lecture dans la transaction.
Alors que dans le niveau READ UNCOMMITTED, des lectures sales restent possibles, le
niveau SNAPSHOT permet de lire les données en cours de modification, dans l’état
cohérent dans lequel elles se trouvaient avant modification. Pour cela, SQL Server
utilise une fonctionnalité interne appelée version de lignes (row versioning). Pour
pouvoir l’utiliser, le support du niveau d’isolation SNAPSHOT doit avoir été activé dans
la base de données. Exemple :
ALTER DATABASE sandbox SET ALLOW_SNAPSHOT_ISOLATION ON
Quand ceci est fait, toutes les transactions qui modifient des données dans cette
base, maintiennent une copie (une version) de ces données avant modification,
dans tempdb, quel que soit leur niveau d’isolation. Si une autre session en niveau
d’isolation SNAPSHOT essaie de lire ces lignes, elle lira la copie des lignes, et non pas
