dbit.one© 2026
000
booting_
Loading experience0%
dbit.one

Izolyatsiya darajalari: bazangiz aslida nimaga yoʻl qoʻyadi

Qisqasi: izolyatsiya darajasi — unumdorlik sozlamasi emas, ilovangiz koʻrishi mumkin boʻlgan natijalar roʻyxati. «read committed» bilan «serializable» oʻrtasida nomi va narxi bor anomaliyalar turadi: qoldiqdan ortiq yechib olish, navbatchisiz qolgan smena, ikki marta raqamlangan hujjat. Hujjatlarda «baza snapshot isolation ni qoʻllaydi» deb oʻqish yetarli emas — bu matnning emas, bajarilishlarning xossasi.

9 daqiqa o‘qish

Qisqacha

  • Izolyatsiya darajasi tezlikni emas, joiz natijalar toʻplamini belgilaydi. Uni hujjatdan emas, bajarilishlardan tekshirish kerak.
  • Snapshot isolation write skew ga yoʻl qoʻyadi: ikki tranzaksiya izchil manzarani koʻradi, birgalikda esa invariantni buzadi.
  • PostgreSQL dagi serializable — Keyhill algoritmi: u kiruvchi va chiquvchi anti-bogʻliqligi bor tranzaksiyani topib, unga qayd etishga yoʻl qoʻymaydi.
  • Tekshiruv bogʻliqliklar grafiga quriladi; versiyalar tartibini kuzatishlardan tiklash uchun qiymatlar noyob qilinadi — Elle usuli.

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.

Hodisa
Bu nima
G0
faqat yozuv bogʻliqliklaridan iborat sikl
G1a
keyin bekor qilingan tranzaksiya yozgan qiymatni oʻqish
G1b
muallifi keyinroq almashtirgan oraliq qiymatni oʻqish
G1c
yozuv va oʻqish bogʻliqliklaridan iborat sikl
G-single
aynan bitta anti-bogʻliqlik boʻlgan sikl — read skew
G2-item
bittadan ortiq anti-bogʻliqlik boʻlgan sikl — write skew

Darajalar zina boʻlib tuziladi: har biri oʻzidan pastdagisi taqiqlagan hamma narsani va yana bittasini taqiqlaydi.

Daraja
Taqiqlarga nima qoʻshadi
read uncommitted
G0
read committed
G1a, G1b, G1c
snapshot isolation
G-single
serializable
G2-item

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.

sql
-- 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;
Ikkalasi bir vaqtda boshlanadi, har hisobda 100, limit — yigʻindiga

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.
text
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% qayd
Zina toʻliq: har bir pogʻona nazariya belgilagan joyda turadi

Ikkinchi 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.

Standart daraja ushlab turmaydigan invariantni qanday yopish kerak
  1. 01

    Invariantni bazaga bering

    Noyob indeks, CHECK va tashqi kalitlar izolyatsiya darajasidan qatʼi nazar tekshiriladi. «Mijozga bitta faol hujjat» qoidasini kodda qoʻriqlagandan koʻra qisman noyob indeks bilan ifodalash arzonroq.

  2. 02

    Qaror uchun oʻqiyotgan narsangizni bloklang

    SELECT … FOR UPDATE oʻ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ʻq WHERE sharti uchun — yoʻq.

  3. 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 … WHERE koʻ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

Izolyatsiya boʻyicha tekshiriladigan javobi bor beshta savol
  • 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.

  1. 01Adya. Weak Consistency: A Generalized Theory and Optimistic ImplementationsMIT dissertatsiyasi, 1999: bogʻliqliklar grafi orqali G0–G2 hodisalari
  2. 02Berenson et al. A Critique of ANSI SQL Isolation Levels1995 yilgi ish: ANSI ning soʻzli taʼriflari notoʻgʻri ekanini koʻrsatgan
  3. 03Cahill, Röhm, Fekete. Serializable Isolation for Snapshot DatabasesPostgreSQL da amalga oshirilgan SSI algoritmi
  4. 04Elle (Jepsen)Versiyalar tartibini tiklaydigan faqat qoʻshiladigan roʻyxatlar usuli
  5. 05adyaMaqoladagi dvigatel va tekshiruvchi: MIT, ichida darajalar zinasi
Muallif
Doniyor Botirov
dbit.one asoschisi · maqola muallifi

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.

Tegishli xizmatlar

Keyingi o‘qish

Loyihangiz bo‘yicha savollar bormi?

Vazifangizni tasvirlang — 24 soat ichida baho, muddat va reja bilan qaytamiz.

[email protected]