Escalation, però
L'escalation dei blocchi con livello di isolamento serializzabile può verificarsi allo stesso modo di altri livelli di isolamento.
- Gli indici corretti possono aiutare a evitare l'escalation dei blocchi fino a un certo punto
- Il blocco di molti indici aumenta la probabilità di escalation dei blocchi; il conteggio è cumulativo tra gli oggetti per una singola istruzione
Alcuni esempi rapidi usando una singola tabella con un singolo indice. ID è la chiave primaria e l'indice cluster sulla tabella.
Una fila
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
Per un singolo valore ID, il blocco è minimo.
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 1 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 1 |
+--------------+---------------+---------------+-------------+
Righe multiple
Ma i blocchi aumenteranno se iniziamo a lavorare in intervalli:
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
Ora abbiamo più blocchi esclusivi su più chiavi:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 2429 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 97 |
+--------------+---------------+---------------+-------------+
Molto più righe
Questo continuerà fino a quando non raggiungiamo un punto di non ritorno:
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
Si tenta di bloccare l'escalation e ha esito positivo:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| X | Comments | OBJECT | 1 |
+--------------+---------------+---------------+-------------+
Fai attenzione
È importante separare due concetti qui: il livello di isolamento sarà serializzabile indipendentemente dal tipo di blocchi. La query sceglie il livello di isolamento e il motore di archiviazione sceglie i blocchi. La serializzazione non comporterà sempre blocchi dell'intervallo: il motore di archiviazione può scegliere qualsiasi tipo di blocco rispetti ancora il livello di isolamento.