030. Tranzaksiyalar, izolyatsiya va lock
Bu mavzuda SAVEPOINT, izolyatsiya darajalari, qatorlarni bloklash bo'yicha 25 ta masala bor. Har bir masala oldida qavs ichida sxema nomi va qiyinlik darajasi ko'rsatilgan. Sxemalar Sxemalar va tayyorlov sahifasida berilgan.
Masalani o'zingiz yechib, natijani Kutilgan natija bilan solishtiring. O'zgartiruvchi masalalarda (INSERT, UPDATE, DELETE, DDL) natija shartda aytilgan tekshiruv so'rovidan olingan. Natija 10 qatordan ko'p bo'lsa, birinchi 10 qator ko'rsatilgan.
1. (dokon, oson) SAVEPOINT: kategoriya qo'shing, savepoint qo'ying, ikkinchisini qo'shing, savepointga ROLLBACK TO qiling; kategoriyalar soni.
2. (dokon, oson) RELEASE SAVEPOINT: o'zgarish saqlanib qoladimi: savepoint, insert, release; soni.
3. (dokon, oson) Tranzaksiya izolyatsiya darajasini ko'rsating: current_setting('transaction_isolation').
4. (dokon, o'rta) SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ni o'rnating va darajani tekshiring.
5. (dokon, o'rta) REPEATABLE READ ni o'rnating va darajani tekshiring.
6. (dokon, o'rta) SELECT ... FOR UPDATE: 1-mahsulot qatorini bloklab, qoldiqni 1 ga kamaytiring.
7. (dokon, o'rta) FOR UPDATE SKIP LOCKED: 1-3 mahsulotni bloklab olish, nechta qator qaytdi.
8. (dokon, o'rta) Advisory lock: pg_advisory_xact_lock(42) olingach, shu sessiya locklari ro'yxatida bor-yo'qligini ko'rsating.
9. (dokon, o'rta) LOCK TABLE: ACCESS EXCLUSIVE bilan mijoz jadvalini bloklab, pg_locks da shu rejimdagi lock bormi.
10. (dokon, qiyin) Tranzaksiya ichida now() qo'shma emas: bir tranzaksiyada ikki marta now() va clock_timestamp() — now() ikki marta bir xilmi.
11. (dokon, qiyin) DEFERRED constraint: FK ni SET CONSTRAINTS ALL DEFERRED qilib, mavjud bo'lmagan mahsulotga element qo'shing, keyin mahsulotni yarating (mahsulot_id=900). Cheklov tuzatilganini tekshiring.
12. (dokon, qiyin) pg_advisory_xact_lock ning try varianti: pg_try_advisory_xact_lock(7) true qaytaradimi.
13. (maktab, oson) Tranzaksiyada bahoni o'chirib ROLLBACK TO savepoint qiling: baholar soni o'zgarmasin.
14. (maktab, o'rta) READ ONLY tranzaksiya: SET TRANSACTION READ ONLY va holatni tekshiring.
15. (maktab, o'rta) FOR SHARE bilan o'quvchini o'qish va pg_locks da RowShareLock bor-yo'qligi (maktab.oquvchi).
16. (maktab, qiyin) Ichma-ich savepoint: s1, s2 qo'yib, s1 ga qaytish s2 ni ham bekor qiladi: 3 ta fan qo'shib (9, s1, 10, s2, 11), s1 ga ROLLBACK TO; fanlar soni (9 bor).
17. (bank, oson) Pul o'tkazma atomikligi: ikki UPDATE bitta tranzaksiyada; umumiy balans o'zgarmasligini tekshiring.
18. (bank, o'rta) SELECT FOR UPDATE bilan hisobni bloklab, balans yetarliligini tekshirib yechish: 1-hisobdan 100 yeching.
19. (bank, o'rta) Isolation: SERIALIZABLE READ ONLY DEFERRABLE ni o'rnating va tekshiring.
20. (bank, qiyin) NOWAIT: 1-hisobni FOR UPDATE NOWAIT bilan olish (bir sessiyada muammosiz) va natija qatori.
21. (bank, qiyin) Savepoint bilan qisman xato: xato SQL ni (1/0) PL/pgSQL EXCEPTION bloki bilan ushlang va keyingi insertni saqlang (DO blok).
22. (kutubxona, oson) Tranzaksiyada a'zo qo'shib, SAVEPOINT ga qaytib, a'zolar sonini tekshiring.
23. (kutubxona, o'rta) Pessimistik bloklash: kitob 1 ni FOR UPDATE bilan o'qib nusxani 1 ga kamaytirish.
24. (kutubxona, qiyin) Deadlock oldini olish: ikki qatorni doim id tartibida bloklash: SELECT ... ORDER BY id FOR UPDATE (1,2 kitoblar) va qaytgan qatorlar soni.
25. (kutubxona, qiyin) Optimistik bloklash: versiya ustuni bilan yangilash: kitob ga 'versiya' qo'shib, versiya=0 sharti bilan UPDATE; nechta qator yangilandi (CTE).