Bitta jumlada ikkita boshqa-boshqa vaʼda
«Bizda snapshot isolation» degani aslida ikkita daʼvo. Birinchisi: undan zaifroq hech narsa yuz bermaydi, yaʼni bu daraja oldini olishi shart boʻlgan anomaliyalar boʻlmaydi. Ikkinchisi: bu haqiqatan SI, oʻsha nom ostidagi qatʼiyroq narsa emas.
Ikkalasini ham kodni yoki hujjatni oʻqib tekshirib boʻlmaydi. Bular matnning emas, bajarilishlarning xossalari: ular tranzaksiyalarning aniq navbatlashuvida, aniq yuk ostida namoyon boʻladi. Demak, bajarilishlarni tutib, soʻroq qilish kerak.
Nomi bor anomaliyalar
1999 yilda Atul Adya dissertatsiyasida ANSI ning noaniq soʻzli taʼriflarini tranzaksiyalar orasidagi bogʻliqliklar grafi orqali aniqlangan hodisalar bilan almashtirdi. Uning nomlaridan foydalanish amaliy jihatdan qulay: ular aynan nimani kuzatganingiz haqida bahsga oʻrin qoldirmaydi.
Darajalar zina boʻlib tuziladi: har biri oʻzidan pastdagisi taqiqlagan hamma narsani va yana bittasini taqiqlaydi.
Snapshot isolation bilan serializatsiya oʻrtasidagi butun amaliy farq — bitta anti-bogʻliqlik. Read skew da u bitta va SI uning oldini oladi. Write skew da ikkita va SI ojiz.
Write skew: boridan koʻproq yechib olish
Klassik holat beozor koʻrinadi. Qoida: mijozning ikki hisobidagi umumiy qoldiq minusga ketmasligi kerak. Ikki tranzaksiya pul yechadi — har biri oʻz hisobidan — va har biri yechishdan oldin qoldiqlar yigʻindisini tekshiradi.
-- tranzaksiya A -- tranzaksiya B
BEGIN; BEGIN;
SELECT sum(balance) FROM accounts SELECT sum(balance) FROM accounts
WHERE client = 7; -- 200 WHERE client = 7; -- 200
-- 200 - 150 >= 0, mumkin -- 200 - 150 >= 0, mumkin
UPDATE accounts SET balance = UPDATE accounts SET balance =
balance - 150 WHERE id = 1; balance - 150 WHERE id = 2;
COMMIT; COMMIT;Yozuv boʻyicha konflikt yoʻq: tranzaksiyalar turli satrlarga tegadi. Har biri izchil suratni oʻqidi va toʻgʻri qaror qabul qildi. Ikkalasi ham qayd etiladi — umumiy qoldiq esa minus yuz boʻladi. Invariant buzilgan, holbuki uni birorta tranzaksiya alohida buzmagan.
Xuddi shu shakl puldan tashqarida ham uchraydi: oxirgi navbatchi shifokor hamkasbi bilan bir vaqtda oʻzini smenadan chiqaradi; ikki menejer omborda oxirgi joyni band qiladi; ikki operatsiya hujjatga bir xil raqam beradi. Hamma joyda bir narsa oʻqiladi, boshqasi oʻzgartiriladi — SI esa bunday juftlikni tuzilishi boʻyicha oʻtkazib yuboradi.
Serializable nima qiladi va u qanchaga tushadi
Snapshot isolation dagi teshikning shakli bor: u yoʻl qoʻyadigan har qanday sikl ketma-ket ikkita anti-bogʻliqlik qirrasini oʻz ichiga oladi. Demak, kiruvchi va chiquvchi anti-bogʻliqligi bor tranzaksiyani — tayanch tranzaksiyani — kuzatib, unga qayd etishga yoʻl qoʻymaslik kifoya.
Bu Keyhill, Röhm va Feketening SSI si (SIGMOD 2008) — PostgreSQL da SERIALIZABLE nomi bilan amalga oshirilgan algoritm. Tekshiruv ataylab konservativ: u aslida serializatsiyalanuvchi boʻlgan bir qism tranzaksiyalarni ham bekor qiladi. Toʻlov — oʻtkazuvchanlik, hech qachon toʻgʻrilik emas.
Ishonmang, tekshiring
Anomaliyani topish uchun bogʻliqliklar grafi kerak: tranzaksiyalar orasidagi «yozuvdan keyin yozuv», «yozuvdan keyin oʻqish» va «oʻqishdan keyin yozuv» qirralari. Keyin sikllar qidiriladi va sikl tarkibiga qarab hodisa oʻz nomini oladi.
Bitta qiyinchilik sodda yondashuvni foydasiz qiladi. Ikki yozuv orasiga qirra tortish uchun qaysi biri oldin boʻlganini bilish kerak — oddiy qiymatlar ustidagi tarixdan esa buni tiklab boʻlmaydi: 5 ning ikki yozuvi farqlanmaydi. Tartibni bazaning oʻzidan soʻrash — ayblanuvchining soʻziga ishonish demak.
Yechim Elle da (Kingsbury, Alvaro, VLDB 2020) topilgan: qiymatlar faqat qoʻshiladigan roʻyxatlar qilinadi va har bir yozuv noyob element qoʻshadi. Endi [a, b, c] ning bitta oʻqilishi oʻzi a dan keyin b, b dan keyin c kelganini bildiradi. Versiyalar tartibi bazaning ichki tuzilmasidan emas, kuzatishlardan tiklanadi — va oʻz tartibi haqida yolgʻon aytgan baza tinglanmaydi, fosh qilinadi.
Qolgani texnika: Tarjan boʻyicha kuchli bogʻlangan komponentlar, har birining ichida esa eng qisqa siklni topadigan kenglik boʻyicha qidiruv. Bu maydagaplik emas: «qirq bitta tranzaksiya orasida sikl bor» — xato haqidagi hisobot emas, qirralari yozib koʻrsatilgan ikki tranzaksiya esa — hisobot.
Zina: ikki tomondan tekshiruv
Mana, hamma narsa shu uchun qurilgan qism. Har bir daraja bir vaqtning oʻzida ikkita daʼvo bilan tekshiriladi.
- Bajaradi. Siddan olingan yuzlab jadvalda daraja oldini olishi shart boʻlgan anomaliyani birorta marta ham ishlab chiqarmadi.
- Eʼlon qilinganidan qatʼiyroq emas. Shunday jadval mavjudki, unda u keyingi zina oldini oladigan narsani aynan ishlab chiqaradi.
read-uncommitted 150 jadvalda bajaradi G1b ga yoʻl qoʻyadi, sid 0
read-committed 150 jadvalda bajaradi G-single ga yoʻl qoʻyadi, sid 1
snapshot-isolation 150 jadvalda bajaradi G2-item ga yoʻl qoʻyadi, sid 25
serializable 150 jadvalda bajaradi hech nimaga yoʻl qoʻymaydi, 51% qaydIkkinchi yarmi birinchisidan muhimroq. Bajarishning oʻzi deyarli hech narsani isbotlamaydi: har bir tranzaksiyani bekor qiladigan dvigatel hamma darajada «toza» boʻlardi, hech narsa topmaydigan tekshiruv esa u bilan rozi boʻlardi. Har bir pogʻonadan keyingi pogʻona taqiqlagan hodisani koʻrsatishni talab qilish bu teshikni yopadi — va ayni paytda tekshiruvning oʻzini tekshiradi: snapshot isolation ostida write skew ni topa olmagan tekshiruv serializable ni oqlashini ham hech nima bilan qoʻllab-quvvatlamagan boʻlardi.
Oxirgi satr ham shu mantiqdan. Raqobatli yuk ostida serializable tranzaksiyalarning 51% ini qayd etadi va bu maʼlumot uchun chop etilmaydi, test bilan tasdiqlanadi: hammasini bekor qilish evaziga olingan oqlovning qadri yoʻq.
Ilovada bu bilan nima qilish kerak
Hamma narsani SERIALIZABLE ga koʻtarish yagona javob emas va koʻpincha eng yaxshisi ham emas. Amaliy yoʻl uchta va ular birga ishlaydi.
- 01
Invariantni bazaga bering
Noyob indeks,
CHECKva tashqi kalitlar izolyatsiya darajasidan qatʼi nazar tekshiriladi. «Mijozga bitta faol hujjat» qoidasini kodda qoʻriqlagandan koʻra qisman noyob indeks bilan ifodalash arzonroq. - 02
Qaror uchun oʻqiyotgan narsangizni bloklang
SELECT … FOR UPDATEoʻqilgan satrlarni yozuv boʻyicha konfliktga aylantiradi va bu satrlarda write skew imkonsiz boʻlib qoladi. Satrlar toʻplami oldindan maʼlum boʻlganda ishlaydi; hali satr yoʻqWHEREsharti uchun — yoʻq. - 03
Invariantni boshqa yoʻl bilan ifodalab boʻlmasa, serializable ni yoqing
Va oʻsha oʻzgarishning oʻzida serializatsiya xatosi boʻyicha takrorlashni qoʻshing: usiz daraja foydalanuvchi uchun xato generatoriga aylanadi.
Alohida esda tutish kerak: tranzaksiyani takrorlash bilan soʻrovni takrorlash — har xil narsalar. Idempotentlik kalitisiz mijoz retrayi ikkinchi operatsiyani yaratadi va bundan hech qanday izolyatsiya darajasi qutqarmaydi; bu haqda toʻlovlar idempotentligi boʻyicha alohida tahlil bor.
Bu usul nimani uddalay olmaydi
- Predikat anti-bogʻliqliklari yoʻq. Toʻliq G2 uchun
SELECT … WHEREkoʻrinishidagi predikat oʻqishlari kerak; bu operatsiyalar toʻplamida ular yoʻq, xulosa chiqaradigan narsa ham yoʻq, G2 ni tekshiraman deyish esa koʻrsatilganidan koʻproq vaʼda qilish boʻlardi. Faqat G2-item tekshiriladi. - Oʻtish — isbot emas. Beqiyos katta fazodan yuzlab jadval. Yaxshi fazzing, teorema emas; SSI ning TLA+ spetsifikatsiyalari tanlanma isbotlay olmaydigan narsani isbotlaydi.
- Tekshiruvchi hamma narsada toʻliq emas. U har bir komponent aʼzosi orqali eng qisqa siklni topadi, barcha sikllarni sanab chiqmaydi: bunday tarixlar uchun yetarli, ammo toʻliq saralashni vaʼda qilish yolgʻon boʻlardi.
- Bu maʼlumotlar bazasi emas. Bardoshlilik ham, tiklanish ham, indekslar ham, eski versiyalarni tozalash ham yoʻq: izolyatsiya dvigateli va boshqa hech narsa.
Oʻzingizdan va pudratchidan nimani soʻrash kerak
- Sizda standart boʻyicha qaysi izolyatsiya darajasi turibdi va jamoadan kim uni konfigga qaramay ayta oladi?
- Bir narsani oʻqib, boshqasini oʻzgartiradigan ikki bir vaqtli tranzaksiyadan ilovaning qaysi invariantlari omon chiqadi?
- Kodda serializatsiya xatosi boʻyicha tranzaksiyani takrorlash bormi — va u test bilan tekshirilganmi?
- Qaysi qoidalar bazaga berilgan (noyob indekslar,
CHECK), qaysilari ilova kodida qoʻriqlanadi? - Tanlangan daraja aynan nima uchun tanlangan boʻlsa, oʻshaning oldini olishini nima tasdiqlaydi: oʻlchovmi yoki vendor hujjatimi?
Bu savollarni maʼlumotdagi xato ishlamay qolishdan qimmatga tushadigan loyihalarda oʻzimizga beramiz: moliyaviy tizimlar, hisob va ombor qoldiqlari, CRM va ERP. Qolgan texnik tahlillar — «Injiniring» ruknida.
Ko‘p so‘raladigan savollar
Biz PostgreSQL da standart sozlamalar bilan ishlaymiz. Bu qanchalik yomon?
U yerda standart — read committed: u iflos oʻqishning oldini oladi, ammo read skew ga ham, write skew ga ham yoʻl qoʻyadi. Koʻpchilik operatsiyalar uchun bu yetarli, «yigʻindi minusga ketmaydi» yoki «faol yozuv aynan bitta» kabi invariantlar uchun — yoʻq. Toʻgʻri javob «hammasini serializable ga koʻtarish» emas, invariantlar roʻyxatini yozib chiqib, har birini indeks, blokirovka yoki daraja bilan yopish.
MySQL dagi repeatable read — bu snapshot isolation mi?
Yaqin, ammo bir xil emas, va nomlar turli MBBT larda turlicha maʼno beradi — aynan shuning uchun tadqiqotlarda daraja nomlari emas, Adya hodisalari ishlatiladi. Amaliy xulosa bitta: nomni emas, konfiguratsiyangiz qanday natijalarga yoʻl qoʻyishini tekshirish kerak.
Oʻquv dvigatelini emas, haqiqiy bazani qanday tekshiramiz?
Xuddi shu yoʻl bilan: raqobatli yuk hosil qilish, operatsiyalar tarixini noyob qiymatlar bilan yozib olish va uni bogʻliqliklar grafi orqali anomaliyalarga tekshirish. Tekshiruvchi dvigatelga bogʻliq emas — u tarixni oʻz formatida qabul qiladi. Bu ish uchun vaqt sinovidan oʻtgan vosita — Jepsen loyihasidagi Elle.
Serializable tizimni kuchli sekinlashtiradimi?
U odatdagidan koʻproq bloklamaydi — koʻproq bekor qiladi. Narx takrorlashga toʻgʻri keladigan tranzaksiyalar ulushida koʻrinadi va u bir xil maʼlumot uchun raqobatga bogʻliq. Shuning uchun raqamni maqoladan olib boʻlmaydi: uni oʻz yukingizda oʻlchaysiz, undan oldin esa kodda takrorlash umuman borligiga ishonch hosil qilasiz.
Manbalar
Maqoladagi da’volarni tekshirish mumkin: quyida qayta hikoya emas, birlamchi manbalar.
- 01Adya. Weak Consistency: A Generalized Theory and Optimistic Implementations — MIT dissertatsiyasi, 1999: bogʻliqliklar grafi orqali G0–G2 hodisalari
- 02Berenson et al. A Critique of ANSI SQL Isolation Levels — 1995 yilgi ish: ANSI ning soʻzli taʼriflari notoʻgʻri ekanini koʻrsatgan
- 03Cahill, Röhm, Fekete. Serializable Isolation for Snapshot Databases — PostgreSQL da amalga oshirilgan SSI algoritmi
- 04Elle (Jepsen) — Versiyalar tartibini tiklaydigan faqat qoʻshiladigan roʻyxatlar usuli
- 05adya — Maqoladagi dvigatel va tekshiruvchi: MIT, ichida darajalar zinasi

Bu maqola, boshqalaridan farqli oʻlaroq, ism bilan imzolangan: uning ortida mijoz yoʻq. Gap ketayotgan kod toʻliq ochiq va oʻsha ismda chop etilgan — uni oʻqish, ishga tushirish va maqoladagi daʼvolarni soʻzga ishonmasdan tekshirish mumkin.