Locking — parallel transaction va processlarning bir xil ma’lumot yoki resource ustida nomuvofiq amal bajarishini cheklaydigan concurrency control mexanizmi. Lock resource’ga vaqtinchalik egalik yoki access rejimini belgilaydi.
Database locking ma’lumot yaxlitligini saqlaydi, ammo noto‘g‘ri ishlatilsa kutish, deadlock va throughput pasayishiga olib keladi.
Shared lock
Shared lock o‘qish uchun ishlatiladi.
Bir nechta transaction ayni resource’da shared lock ushlashi mumkin.
Lekin exclusive write lock shared locklar bo‘shamaguncha kutishi mumkin.
Aniq xatti-harakat isolation va database implementationiga bog‘liq.
Exclusive lock
Exclusive lock resource’ni o‘zgartirish uchun olinadi.
Boshqa transaction shu resource’da mos kelmaydigan read yoki write lock ololmaydi.
Update va delete ko‘pincha exclusive lock talab qiladi.
Row-level lock
Faqat ma’lum rowlar qulflanadi.
Afzalligi — boshqa rowlar ustida parallel transactionlar davom etadi.
Misol:
SELECT *
FROM accounts
WHERE id = 15
FOR UPDATE;
Bu rowni keyingi update uchun lock qilishi mumkin.
Table-level lock
Butun table yoki table operation turi bloklanadi.
Keng qamrovli DDL, bulk operation yoki database ichki qarori table lockga olib kelishi mumkin.
Table lock boshqarish osonroq, ammo concurrency’ni keskin kamaytiradi.
Page va key-range lock
Ayrim database’lar storage page yoki index key oralig‘ini lock qiladi.
Range lock phantom insertni oldini olish uchun ishlatilishi mumkin.
Masalan, price BETWEEN 10 AND 20 oralig‘iga yangi row qo‘shilishi cheklanadi.
Lock compatibility
Har lock turi boshqasi bilan mos yoki nomos bo‘ladi.
Soddalashtirilgan model:
| Mavjud lock | So‘ralgan shared | So‘ralgan exclusive |
|---|---|---|
| Shared | Mos | Kutadi |
| Exclusive | Kutadi | Kutadi |
Real database’da ko‘proq lock mode mavjud bo‘lishi mumkin.
Pessimistic locking
Conflict bo‘lishidan oldin resource lock qilinadi.
Yondashuv:
- row lock qilinadi;
- qiymat tekshiriladi;
- update bajariladi;
- commitda lock bo‘shatiladi.
Conflict ehtimoli yuqori va transaction qisqa bo‘lsa foydali.
Kamchiligi — kutish va deadlock.
Optimistic locking
Resource oldindan lock qilinmaydi.
Update vaqtida version yoki timestamp tekshiriladi.
UPDATE documents
SET content = ?, version = version + 1
WHERE id = ? AND version = ?;
Affected row nol bo‘lsa boshqa transaction oldin o‘zgartirgan.
Bu past conflictli tizimda yaxshi concurrency beradi.
SELECT FOR UPDATE
Rowlarni o‘qib, keyin update qilish kerak bo‘lsa FOR UPDATEga o‘xshash clause ishlatiladi.
Misollar:
Oddiy SELECTdan keyin alohida UPDATE orasida boshqa transaction qiymatni o‘zgartirishi mumkin.
SKIP LOCKED
Workerlar queue table’dan task olganda boshqa worker lock qilgan rowlarni kutmasdan o‘tkazib yuborishi mumkin.
Bu parallel worker pool uchun qulay.
Biroq doim locklangan row starvationga uchrashi mumkin.
Task retry va lock timeout siyosati kerak.
NOWAIT
Lock band bo‘lsa kutmasdan darhol xato qaytaradi.
Application:
qilishi mumkin.
Bu uzun va noma’lum kutishni oldini oladi.
Lock timeout
Transaction lockni ma’lum vaqtgacha kutadi.
Timeout tugasa statement yoki transaction xato beradi.
Juda qisqa timeout normal contentionni xatoga aylantiradi.
Juda uzun timeout user requestlarini uzoq ushlab turadi.
Deadlock
Transaction A resource Xni, transaction B resource Yni ushlab turadi.
A Yni, B esa Xni kutsa cycle hosil bo‘ladi.
Database deadlockni aniqlab bir transactionni victim sifatida abort qiladi.
Deadlockni butunlay yo‘qotish qiyin, lekin kamaytirish mumkin.
Lock tartibi
Bir nechta resource kerak bo‘lsa barcha transactionlar ularni bir xil tartibda oladi.
Masalan, account transferida kichik IDli account avval lock qilinadi.
Bu qarama-qarshi lock cycle ehtimolini kamaytiradi.
Lock escalation
Ko‘p row lock saqlash qimmat bo‘lsa database ularni table yoki yirikroq lockga aylantirishi mumkin.
Bu lock escalation.
Natijada boshqa transactionlar kutilmaganda kengroq bloklanadi.
Batch hajmi va index orqali ta’sir kamaytiriladi.
Intent lock
Hierarchik lock tizimida transaction table ichidagi rowlarni lock qilmoqchi ekanini intent lock bilan bildiradi.
Bu table-level va row-level locklar orasidagi compatibility’ni boshqaradi.
Application ko‘pincha intent lockni bevosita so‘ramaydi.
Advisory lock
Advisory lock database rowiga avtomatik bog‘lanmagan application-defined lock.
Masalan:
Lock ID yoki nom application tomonidan tanlanadi.
Database constraint o‘rniga ishlatish ehtiyotkorlik talab qiladi.
MVCC va lock
MVCC readerga eski committed versiyani ko‘rsatib, reader-writer bloklanishini kamaytiradi.
Ammo write-write conflict uchun lock yoki version check baribir kerak.
DDL, unique constraint va foreign key ham lock ishlatishi mumkin.
Lock monitoring
Kuzatiladi:
- lock wait vaqti;
- blocked session;
- blocking query;
- deadlock soni;
- lock turi;
- transaction yoshi;
- application request ID.
Faqat sekin query matni emas, uni kim bloklayotgani ham muhim.
Lockni qisqartirish
Lock vaqtini kamaytirish usullari:
- transactionni qisqa saqlash;
- indexdan foydalanish;
- user inputni transaction tashqarisida olish;
- tashqi API’ni transaction ichida kutmaslik;
- rowlarni bir xil tartibda lock qilish;
- katta batchni boshqarish.
Bog‘liq tushunchalar
Concurrency control, Shared lock, Exclusive lock, Row lock, Table lock, Pessimistic locking, Optimistic locking, Deadlock, Lock timeout, MVCC