Eskalation jedoch
Die Sperreneskalation unter der serialisierbaren Isolationsstufe kann genauso erfolgen wie bei anderen Isolationsstufen.
- Richtige Indizes können dazu beitragen, eine Eskalation der Sperren bis zu einem gewissen Punkt zu vermeiden
- Das Sperren vieler Indizes erhöht die Wahrscheinlichkeit einer Sperreneskalation. Die Anzahl ist für alle Objekte für eine einzelne Anweisung kumulativ
Einige kurze Beispiele für die Verwendung einer einzelnen Tabelle mit einem einzelnen Index. ID ist der Primärschlüssel und der Clustered-Index für die Tabelle.
Eine Reihe
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
Für einen einzelnen ID-Wert ist das Sperren minimal.
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 1 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 1 |
+--------------+---------------+---------------+-------------+
Mehrere Zeilen
Aber die Sperren werden aufgehen, wenn wir anfangen, in Bereichen zu arbeiten:
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
Jetzt haben wir exklusivere Schlösser für mehr Schlüssel:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 2429 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 97 |
+--------------+---------------+---------------+-------------+
Viel mehr Zeilen
Dies wird so lange fortgesetzt, bis wir einen Wendepunkt erreichen:
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
Eskalationssperre wird versucht und ist erfolgreich:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| X | Comments | OBJECT | 1 |
+--------------+---------------+---------------+-------------+
Passt auf
Es ist wichtig, hier zwei Konzepte zu trennen: Die Isolationsstufe ist unabhängig von der Art der Sperren serialisierbar. Die Abfrage wählt die Isolationsstufe und die Speicher-Engine die Sperren. Serialisierbar führt nicht immer zu Entfernungssperren - die Speicher-Engine kann auswählen, welche Art von Sperren die Isolationsstufe noch einhalten.