223
7.3 Niveaux d’isolation de la transaction
tered et nonclustered). Ils ont deux composants : une partie étendue, et une partie
ligne. Leur mode, visible par exemple dans la colonne request_mode de la vue
sys.dm_tran_locks, est écrit de cette façon : « étendue-ligne ». Par exemple, un verrou de ressource partagé et d’étendue partagée sera écrit « RangeS-S », un verrou de
ressource exclusif avec verrou d’étendue exclusif, « RangeX-X ». La liste est disponible dans les BOL, sous l’entrée « Verrouillage d’étendues de clés » (Key-Range Locking).
Sur une table sans index clustered, et dont les colonnes de la clause WHERE ne sont
pas indexées, SQL Server sera obligé de poser un verrou de table. Démonstration :
USE tempdb
GO
CREATE TABLE dbo.testSerializable
(nombre int, texte varchar(50) COLLATE French_BIN)
GO
INSERT INTO dbo.testSerializable VALUES (1, 'un')
INSERT INTO dbo.testSerializable VALUES (2, 'deux')
INSERT INTO dbo.testSerializable VALUES (3, 'trois')
INSERT INTO dbo.testSerializable VALUES (4, 'quatre')
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
-- sans index
UPDATE dbo.testSerializable
SET texte = 'DEUX'
WHERE nombre = 2
-- requête sur sys.dm_tran_locks
ROLLBACK
GO
CREATE NONCLUSTERED INDEX nix$testSerializable$nombre
ON dbo.testSerializable (nombre)
GO
BEGIN TRAN
-- avec index
UPDATE dbo.testSerializable
SET texte = 'DEUX'
WHERE nombre = 2
-- requête sur sys.dm_tran_locks
ROLLBACK
GO
Précédent

- 235/334

Suivant