Bosh sahifa Wiki Locking

Locking

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:

  1. row lock qilinadi;
  2. qiymat tekshiriladi;
  3. update bajariladi;
  4. 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:

  • bitta report generator;
  • migration leader;
  • schedule task;
  • business key.

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:

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