Bosh sahifa Wiki Concurrency control

Concurrency control

Concurrency control — bir nechta transaction yoki process bir vaqtning o‘zida umumiy ma’lumotni o‘qib-yozganda izchil natija saqlaydigan mexanizmlar majmui. U parallel ishlash imkonini beradi, shu bilan birga lost update, dirty read va zid yozuvlar kabi anomaliyalarni cheklaydi.

Asosiy anomaliyalar

Dirty read boshqa transaction commit qilmagan qiymatni o‘qishdir; u rollback qilinsa o‘quvchi mavjud bo‘lmagan holatga tayangan bo‘ladi. Non-repeatable read bitta transaction bir satrni qayta o‘qiganda boshqa commit sabab yangi qiymat ko‘rishidir. Phantom read bir predicate bo‘yicha satrlar to‘plami o‘zgarishini anglatadi.

Lost update’da ikki transaction bir xil eski qiymatni o‘qib, alohida natija yozadi va oxirgi yozuv birinchisini yo‘qotadi. Write skew’da transactionlar turli satrni o‘zgartirsa ham birgalikdagi invariant buziladi.

Lock asosidagi boshqaruv

Pessimistic yondashuv conflict ehtimolini oldindan hisobga olib shared yoki exclusive lock oladi. Shared lock bir nechta o‘quvchiga ruxsat beradi, exclusive lock esa yozuvchini boshqa incompatible accessdan ajratadi. Lock row, page, table yoki key range darajasida bo‘lishi mumkin.

Two-phase locking transaction avval locklarni yig‘ib, keyin chiqarish bosqichiga o‘tishini talab qiladi. Strict variant write locklarni commitgacha saqlab, dirty read va cascading rollbackni cheklaydi. Lock contention wait va deadlock keltirishi mumkin.

MVCC

Multi-version concurrency control satrning bir nechta versiyasini saqlab, o‘quvchiga snapshotga mos versiyani ko‘rsatadi. Reader writer’ni ko‘p hollarda bloklamaydi. Writerlar orasidagi conflict baribir tekshiriladi. Eski versiyalarni tozalash uchun eng eski faol snapshot aniqlanadi; uzoq transaction garbage collection va storage o‘sishiga to‘sqinlik qiladi.

Snapshot isolation dirty va non-repeatable readni cheklaydi, ammo ayrim write skew holatiga ruxsat berishi mumkin. Serializable isolation natijani transactionlar qandaydir ketma-ket tartibda bajargandek qilishga intiladi. DBMS buni lock, predicate lock yoki serialization failure aniqlash orqali bajaradi.

Optimistic yondashuv

Optimistic locking o‘qishda uzoq lock ushlamaydi. Update vaqtida version yoki oldingi qiymat o‘zgarmaganini shart bilan tekshiradi. Shart bajarilmasa conflict qaytarilib, application qayta o‘qiydi va amalni takrorlaydi. Conflict kam bo‘lsa samarali, yuqori contentionda retry ko‘payadi.

Deadlock va starvation

Ikki transaction bir-biri ushlab turgan lockni kutsa deadlock hosil bo‘ladi. Database wait-for graph orqali cycle topib, bir transactionni victim sifatida rollback qiladi. Locklarni bir xil tartibda olish ehtimolni kamaytiradi. Timeout deadlockni to‘liq aniqlash o‘rnini bosmaydi.

Adolatsiz scheduler yoki doimiy yuqori-priority ish bitta transactionni uzoq kutdirishi starvation deyiladi. Queue va lock manager fairness siyosati buni boshqaradi.

Isolation va biznes invariant

Isolation level tanlovi performance bilan correctness o‘rtasidagi muvozanatdir. “Read committed” nomi turli DBMSda lock yoki MVCC orqali boshqacha xatti-harakat berishi mumkin. Muhim invariant concurrency testi bilan tekshiriladi. Unique constraint, foreign key va atomic conditional update application tekshiruvini barcha writerlar uchun mustahkamlaydi.

Taqsimlangan tizimlarda

Bir nechta database shard yoki service’ga bo‘lingan holatda lokal lock global tartib bermaydi. Distributed lock lease va fencing token bilan eski egasining kechikkan yozuvini rad etishi mumkin. Consensus replicated state uchun tartib beradi, lekin application invariantini qaysi keylar bo‘yicha birlashtirish kerakligi alohida modellashtiriladi. Network partition tanlangan consistency va availability muvozanatini ochib beradi.

Bog‘liq tushunchalar

Transaction isolation, MVCC, Shared lock, Exclusive lock, Deadlock, Optimistic locking, Serializable, Lost update