MVCC — Multi-Version Concurrency Control, qanday ishlaydi

~20 daq · PostgreSQL · Transaction va Concurrency

O'quvchi va yozuvchi bir vaqtda ishlayapti. Oddiy lock tizimida o'quvchi yozuvchini kutishi kerak — yoki aksincha. PostgreSQL da esa o'quvchi hech qachon yozuvchini kutmaydi. Bu MVCC tufayli.


MVCC nima?

Multi-Version Concurrency Control — har bir qatorning bir nechta versiyasi bir vaqtda mavjud bo'lishi.

UPDATE bajarilganda:

  • Eski versiya o'chirilmaydi — "o'lik" deb belgilanadi
  • Yangi versiya qo'shiladi
qator id=1, balans=1000  [versiya 1, faol]
↓ UPDATE balans=500
qator id=1, balans=1000  [versiya 1, o'lik — eski tranzaksiyalar uchun]
qator id=1, balans=500   [versiya 2, faol — yangi tranzaksiyalar uchun]

Qanday ishlaydi

Har qator ikki yashirin ustun bilan saqlanadi:

xmin — qatorniyu yaratgan tranzaksiya ID
xmax — qatorniyu o'chirgan/yangilagan tranzaksiya ID (bo'sh = hali faol)

Tranzaksiya har qatorni ko'rishda tekshiradi:

  • xmin — mening tranzaksiya ID dan kichikmi? (yozilgan)
  • xmax — bo'shmi yoki mening ID dan kattami? (hali o'chirilmagan)

Bu shartlarga mos kelsa — ko'radi. Aks holda — ko'rmaydi.


MVCC va Isolation Level

Read Committed:    har SQL da snapshot — yangi COMMIT lar ko'rinadi
Repeatable Read:   tranzaksiya boshidagi snapshot — muzlab qoladi
Serializable:      to'liq izolyatsiya

MVCC tufayli o'quvchilar yozuvchilarni, yozuvchilar o'quvchilarni bloklamamaydi — faqat yozuvchilar yozuvchilarni bloklaydi.


Dead tuples va VACUUM

O'lik versiyalar diskda to'planadi — bu dead tuples. VACUUM ularni tozalaydi:

SELECT relname, n_dead_tup, n_live_tup
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000;

Ko'p UPDATE/DELETE bo'lgan jadvallarda VACUUM muhim.


Transaction ID Wraparound

PostgreSQL tranzaksiya ID lari 32-bit — maksimum ~4 milliard. Agar VACUUM ishlasa bu muammo yo'q. Ishlamasa — wraparound xavfi:

WARNING: database "mydb" must be vacuumed within 10000000 transactions

Bu ogohlantirishda VACUUM FREEZE kerak:

VACUUM FREEZE jadval;

Autovacuum buning oldini oladi — o'chirilmasin.


Xulosa

MVCC — har qatorning bir nechta versiyasi

UPDATE/DELETE:
  eski versiya → "o'lik" belgi (xmax)
  yangi versiya → yangi qator (xmin)

Natija:
  O'quvchilar yozuvchilarni kutmaydi
  Yozuvchilar o'quvchilarni kutmaydi
  Faqat yozuvchi–yozuvchi bloklashadi

VACUUM — o'lik qatorlarni tozalash (MVCC uchun zarur)

Keyingi dars

48-dars: Normalizatsiya — 1NF, 2NF, 3NF, BCNF