Эскалация, хотя
Повышение уровня блокировки при сериализуемом уровне изоляции может происходить так же, как и с другими уровнями изоляции.
- Правильные индексы могут помочь избежать эскалации блокировки до определенной точки
- Блокировка многих индексов увеличит вероятность повышения блокировки; количество суммируется по объектам для одного оператора
Несколько быстрых примеров использования одной таблицы с одним индексом. Идентификатор является первичным ключом и кластеризованным индексом в таблице.
Одна строка
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
Для одного значения Id блокировка минимальна.
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 1 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 1 |
+--------------+---------------+---------------+-------------+
Несколько строк
Но блокировки возрастут, если мы начнем работать в диапазонах:
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
Теперь у нас есть больше эксклюзивных замков на большем количестве ключей:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 2429 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 97 |
+--------------+---------------+---------------+-------------+
Намного больше рядов
Это будет продолжаться, пока мы не достигнем переломного момента:
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
Попытка эскалации блокировки выполнена успешно:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| X | Comments | OBJECT | 1 |
+--------------+---------------+---------------+-------------+
Обращать внимание
Здесь важно разделить две концепции: уровень изоляции будет сериализуемым, независимо от типа блокировок. Запрос выбирает уровень изоляции, а механизм хранения выбирает блокировки. Сериализуемый не всегда приводит к блокировкам диапазона - механизм хранения может выбрать любой тип блокировки, который все еще соответствует уровню изоляции.