MVCC — Multi-Version Concurrency Control, qanday ishlaydi
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