BEGIN; UPDATE acct SET bal = bal - 100 WHERE id = 'Alice'; UPDATE acct SET bal = bal + 100 WHERE id = 'Bob';COMMIT; -- both lines persist together, or neither does
WHY do we need this? Kyunki real kaam akele ek statement mein kabhi fit nahi hota, aur duniya hostile hai: power mid-write fail ho sakti hai, do users ek hi row edit kar sakte hain, ek app beech mein exception throw kar sakta hai. Guarantees ke bina, paisa create ya destroy ho jaata hai.
WHY it feels obvious but is hard: Alice se ghataana aur Bob ko jodna physically alag disk writes hain. Agar machine dono ke beech mein mar jaaye, toh ₹100 gaayab ho gaya. Atomicity is intermediate state ko kabhi permanent hone se rokta hai.
HOW it's implemented — the undo log: kisi row ko change karne se pehle, DB purani value ko ek undo log mein likhta hai. ROLLBACK par (ya uncommitted transaction ki crash recovery par), engine undo log ko backwards replay karta hai purani values restore karne ke liye.
WHY this is different from Atomicity: atomicity execution ki completeness ke baare mein hai; consistency rules ki correctness ke baare mein hai. Ek transaction poori tarah complete ho sakta hai (atomic) phir bhi negative balance chhodne ki koshish kar sakta hai — consistency wo contract hai jo kehta hai "agar teri transaction koi rule todegi, toh use reject kiya jaayega (rollback), commit nahi kiya jaayega."
HOW: DB declared constraints enforce karta hai (CHECK (bal >= 0), PRIMARY KEY, FOREIGN KEY) commit/statement time par. Application un invariants ke liye zimmedaar hai jo DB nahin jaanta (jaise "total money constant hai").
WHY: agar Alice ka transfer aur ek bank-wide "sab balances jodo" report ek saath chalein, toh report Alice ka debit count kar sakti hai lekin Bob ka credit miss kar sakti hai → ₹100 kho gaya lagta hai. Isolation aisi half-states ko padhne se rokta hai.
WHY the hard part: disk writes speed ke liye RAM mein buffered hote hain. Agar COMMIT data actually non-volatile storage mein jaane se pehle return kar de, toh ek millisecond baad crash ek "successful" payment kho dega.
HOW — Write-Ahead Logging (WAL): rule hai pehle log, baad mein data. COMMIT success return karne se pehle, DB redo log ko durable storage mein flush karta hai (fsync). Actual data pages baad mein lazily likhe ja sakte hain. Restart par, recovery redo log replay karta hai kisi committed changes ko re-apply karne ke liye jo abhi tak data files mein nahi pahunche the.
Socho tum aur tumhara dost cups ke beech ek marble pass kar rahe ho, aur koi badhta-ghata lights on-off kar raha hai (crashes!) aur doosre bachche bhi haath daalne lagte hain (other users!). ACID chaar ghar ke rules hain taaki marble game kabhi galat na ho:
A: ya toh tum puri tarah marble pass karte ho ya nahi karte — kabhi beech mein nahi girata.
C: tumhein kabhi "−1 marble" cup rakhne ki permission nahi hai; yeh rules todata hai, toh hum undo karte hain.
I: jab doosre bachche ek saath khelein, toh lagana chahiye jaise sab ne clean turns liye, chaotic grab nahi.
D: jab tum "done!" keh do, toh woh move permanent ink mein likha hai — lights bhi mar jaayein, phir bhi rahega.