Escalade, cependant
L'escalade de verrous sous un niveau d'isolement sérialisable peut se produire de la même manière qu'avec d'autres niveaux d'isolement.
- Des index corrects peuvent aider à éviter l'escalade des verrous jusqu'à un certain point
- Le verrouillage de nombreux index augmentera la probabilité d'escalade des verrous; le nombre est cumulatif entre les objets pour une seule instruction
Quelques exemples rapides utilisant une seule table avec un seul index. Id est la clé primaire et l'index cluster de la table.
Une rangée
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
UPDATE c
SET c.Score = 2147483647
FROM dbo.Comments AS c
WHERE c.Id = 138; --One value
ROLLBACK
Pour une seule valeur Id, le verrouillage est minimal.
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 1 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 1 |
+--------------+---------------+---------------+-------------+
Plusieurs lignes
Mais les verrous augmenteront si nous commençons à travailler dans des plages:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
UPDATE c
SET c.Score = 2147483647
FROM dbo.Comments AS c
WHERE c.Id BETWEEN 1 AND 5000; -- Small range
ROLLBACK
Nous avons maintenant des verrous plus exclusifs sur plus de clés:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 2429 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 97 |
+--------------+---------------+---------------+-------------+
Beaucoup plus de lignes
Cela continuera jusqu'à ce que nous atteignions un point de basculement:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
UPDATE c
SET c.Score = 2147483647
FROM dbo.Comments AS c
WHERE c.Id BETWEEN 1 AND 11655; --Larger range
ROLLBACK
L'escalade de verrous est tentée et réussie:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| X | Comments | OBJECT | 1 |
+--------------+---------------+---------------+-------------+
Faites attention
Il est important de séparer deux concepts ici: le niveau d'isolement sera sérialisable quel que soit le type de verrous pris. La requête choisit le niveau d'isolement et le moteur de stockage choisit les verrous. La sérialisation ne se traduira pas toujours par des verrous de plage - le moteur de stockage peut choisir le type de verrous qui respecte toujours le niveau d'isolement.