Escalada, no entanto
A escalação de bloqueio no nível de isolamento serializável pode ocorrer da mesma forma que ocorre com outros níveis de isolamento.
- Índices corretos podem ajudar a evitar o escalonamento de bloqueios até um ponto
- O bloqueio de muitos índices aumentará a probabilidade de escalação de bloqueios; a contagem é cumulativa entre objetos para uma única instrução
Alguns exemplos rápidos usando uma única tabela com um único índice. Id é a chave primária e o índice clusterizado na tabela.
Uma linha
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 um único valor de ID, o bloqueio é mínimo.
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 1 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 1 |
+--------------+---------------+---------------+-------------+
Linhas múltiplas
Mas os bloqueios subirão se começarmos a trabalhar em intervalos:
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
Agora, temos mais bloqueios exclusivos em mais chaves:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 2429 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 97 |
+--------------+---------------+---------------+-------------+
Way More Rows
Isso continuará até atingirmos um ponto de inflexão:
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
A escalação de bloqueio é tentada e é bem-sucedida:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| X | Comments | OBJECT | 1 |
+--------------+---------------+---------------+-------------+
Preste atenção
É importante separar dois conceitos aqui: o nível de isolamento será serializável, independentemente do tipo de bloqueio. A consulta escolhe o nível de isolamento e o mecanismo de armazenamento escolhe os bloqueios. Serializable nem sempre resulta em bloqueios de intervalo - o mecanismo de armazenamento pode escolher qualquer tipo de bloqueio que ainda atenda ao nível de isolamento.