Tranzaksiyalar va ACID
239 daq
Bankda pul o‘tkazish ikki qadamdan iborat: bir hisobdan ayirish va boshqasiga qo‘shish. Agar birinchisi bajarilib, ikkinchisidan oldin server o‘chib qolsa-chi? Pul shunchaki yo‘qoladi. Tranzaksiya bunga yo‘l qo‘ymaydi.
Hammasi yoki hech narsa
BEGIN;
UPDATE accounts SET balance = balance - 500000 WHERE id = 1;
UPDATE accounts SET balance = balance + 500000 WHERE id = 2;
COMMIT;BEGIN— tranzaksiya boshlandi;COMMIT— hammasini saqlash;ROLLBACK— hammasini bekor qilish, go‘yo hech narsa bo‘lmagandek.
COMMIT gacha bo‘lgan o‘zgarishlarni boshqa foydalanuvchilar ko‘rmaydi. Xato bo‘lsa yoki aloqa uzilsa — baza tranzaksiyani o‘zi bekor qiladi.
O‘zingizni himoya qilish
Tranzaksiya — xavfli buyruqdan oldin xavfsizlik kamari:
BEGIN;
DELETE FROM dori WHERE yaroqlilik_muddati < '2026-01-01';
SELECT count(*) FROM dori; -- natijani tekshiramiz
ROLLBACK; -- yoki COMMIT, agar hammasi to‘g‘ri bo‘lsaErkin rejimda sinab ko‘ring: tayyor bazani yuklang, BEGIN dan keyin hamma qatorni o‘chiring, SELECT bilan ko‘ring, keyin ROLLBACK — qatorlar joyida.
ACID
Yaxshi baza tranzaksiyalar uchun to‘rt narsani kafolatlaydi:
| Harf | Ma’nosi | Oddiy tilda |
|---|---|---|
| Atomicity | bo‘linmaslik | hammasi yoki hech narsa |
| Consistency | izchillik | qoidalar (kalitlar, cheklovlar) buzilmaydi |
| Isolation | ajratilganlik | parallel tranzaksiyalar bir-biriga xalaqit bermaydi |
| Durability | barqarorlik | COMMIT dan keyin ma’lumot yo‘qolmaydi, hatto server o‘chsa ham |
Parallel ishlash muammolari
Bir vaqtda ko‘p odam ishlaganda nima bo‘lishi mumkin:
- iflos o‘qish — boshqaning hali saqlanmagan o‘zgarishini ko‘rish;
- takrorlanmas o‘qish — bir tranzaksiya ichida bir qatorni ikki marta o‘qisangiz, har xil natija;
- fantom qatorlar — qayta sanasangiz, yangi qatorlar paydo bo‘ladi.
Bularning oldini olish darajasi izolyatsiya darajasi deyiladi.
PostgreSQL odatda READ COMMITTED darajasida ishlaydi: har bir buyruq faqat saqlangan ma’lumotni ko‘radi. Kerak bo‘lsa: BEGIN ISOLATION LEVEL SERIALIZABLE;
Avtomatik saqlash
Tranzaksiya boshlanmasa, har bir buyruq o‘zi alohida tranzaksiya bo‘lib, darhol saqlanadi (autocommit). Shuning uchun BEGIN siz yozilgan DELETE ni ROLLBACK bilan qaytarib bo‘lmaydi.
SAVEPOINT — oraliq nuqta
BEGIN;
INSERT INTO mijoz (ism) VALUES ('Aziz');
SAVEPOINT birinchi;
INSERT INTO mijoz (ism) VALUES ('Xato');
ROLLBACK TO SAVEPOINT birinchi; -- faqat ikkinchisi bekor
COMMIT;Esda qoldiring
BEGIN … COMMIT— hammasi saqlanadi;ROLLBACK— hammasi bekor.- ACID — bo‘linmaslik, izchillik, ajratilganlik, barqarorlik.
- Xavfli o‘zgarishdan oldin
BEGINyozing.