Aunque la escalada
La escalada de bloqueo bajo un nivel de aislamiento serializable puede ocurrir de la misma manera que ocurre con otros niveles de aislamiento.
- Los índices correctos pueden ayudar a evitar la escalada de bloqueo hasta cierto punto
- El bloqueo de muchos índices aumentará la probabilidad de una escalada de bloqueo; el recuento es acumulativo entre objetos para una sola declaración
Algunos ejemplos rápidos que usan una sola tabla con un solo índice. Id es la clave principal y el índice agrupado en la tabla.
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
Para un solo valor de Id, el bloqueo es mínimo.
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 1 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 1 |
+--------------+---------------+---------------+-------------+
Filas múltiples
Pero las cerraduras subirán si comenzamos a trabajar en rangos:
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
Ahora tenemos cerraduras más exclusivas en más llaves:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 2429 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 97 |
+--------------+---------------+---------------+-------------+
Mucho más filas
Esto continuará hasta que alcancemos un punto de inflexión:
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
Se intenta la escalada de bloqueo y se realiza correctamente:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| X | Comments | OBJECT | 1 |
+--------------+---------------+---------------+-------------+
Presta atención
Es importante separar dos conceptos aquí: el nivel de aislamiento será serializable sin importar qué tipo de bloqueos se tomen. La consulta elige el nivel de aislamiento y el motor de almacenamiento elige los bloqueos. Serializable no siempre dará como resultado bloqueos de rango: el motor de almacenamiento puede elegir cualquier tipo de bloqueos que aún respeten el nivel de aislamiento.