Eskalasi, meskipun
Eskalasi kunci di bawah tingkat isolasi serializable dapat terjadi sama seperti halnya dengan tingkat isolasi lainnya.
- Indeks yang benar dapat membantu menghindari eskalasi kunci hingga titik tertentu
- Mengunci banyak indeks akan meningkatkan kemungkinan eskalasi kunci; penghitungan bersifat kumulatif di seluruh objek untuk satu pernyataan
Beberapa contoh cepat menggunakan tabel tunggal dengan indeks tunggal. Id adalah kunci utama dan indeks berkerumun di atas meja.
Satu baris
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
Untuk nilai Id tunggal, penguncian minimal.
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 1 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 1 |
+--------------+---------------+---------------+-------------+
Beberapa baris
Tetapi kunci akan naik jika kita mulai bekerja dalam rentang:
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
Sekarang kami memiliki lebih banyak kunci eksklusif pada lebih banyak kunci:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X | Comments | KEY | 2429 |
| IX | Comments | OBJECT | 1 |
| IX | Comments | PAGE | 97 |
+--------------+---------------+---------------+-------------+
Lebih Banyak Baris
Ini akan berlanjut sampai kita mencapai titik kritis:
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
Eskalasi kunci dicoba dan berhasil:
+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| X | Comments | OBJECT | 1 |
+--------------+---------------+---------------+-------------+
Perhatian
Sangat penting untuk memisahkan dua konsep di sini: tingkat isolasi akan menjadi serial, apa pun kunci yang diambil. Permintaan memilih tingkat isolasi, dan mesin penyimpanan memilih kunci. Serializable tidak akan selalu menghasilkan penguncian jangkauan - mesin penyimpanan dapat memilih jenis pengunci mana saja yang memenuhi tingkat isolasi.