Database Transactions
কিছু operation একসাথে — সব হবে বা কিছুই না।
একটি অনলাইন কেনাকাটা: আপনি ১,০০০ টাকার product কিনলেন। তিনটি কাজ একসাথে হবে — (১) account থেকে ১,০০০ টাকা কাটা (২) inventory থেকে ১টা product সরানো (৩) order create। এর মধ্যে যেকোনো একটি fail হলে আগের সব রোলব্যাক হতে হবে — নাহলে data inconsistent। এটাই Transaction।
Transaction কী?
Database Transaction = এক বা একাধিক operation-এর সমষ্টি যা একটি atomic unit হিসেবে execute হয়। সব operation success — COMMIT। এক fail — ROLLBACK।
Basic Syntax
ACID-এর সারমর্ম
Transaction-এর গুরুত্বের কারণ ACID:
- A: Atomic — সব হবে বা কিছুই না।
- C: Consistent — DB rule সব সময় valid।
- I: Isolated — concurrent transaction interfere করবে না।
- D: Durable — commit-এর পর permanent।
Transaction States
- Active: Transaction চলছে।
- Partially Committed: শেষ statement execute, কিন্তু এখনো disk-এ লেখা হয়নি।
- Committed: সফলভাবে শেষ — disk-এ লেখা।
- Failed: কোনো সমস্যায় execute করা যায়নি।
- Aborted: Rollback হয়ে গেছে।
COMMIT vs ROLLBACK
COMMIT
Transaction-এর সব change permanent করা। Disk-এ WAL মাধ্যমে durable করা হয়। এক বার commit হলে — আর rollback নেই।
ROLLBACK
Transaction-এর সব change বাতিল। DB transaction-এর শুরুতে যে state ছিল — সে অবস্থায় ফিরে।
Savepoints
বড় transaction-এ মাঝখানে checkpoint:
Isolation Levels-এর Anomalies
Dirty Read
Transaction A uncommitted change করেছে। Transaction B সেই data পড়ছে — কিন্তু A rollback হলে B-র read invalid।
Non-Repeatable Read
Transaction A একটি row পড়লো। B সেই row update করল ও commit। A আবার পড়লে — ভিন্ন value।
Phantom Read
Transaction A একটি query চালালো (যেমন COUNT)। B একটি new row insert করে commit। A আবার চালালে — count বদলায়।
Levels prevent কোনটি?
Read Uncommitted
- Dirty read: ✗
- Non-repeatable: ✗
- Phantom: ✗
- Lowest, fastest
Read Committed
- Dirty read: ✓
- Non-repeatable: ✗
- Phantom: ✗
- PostgreSQL default
Repeatable Read
- Dirty read: ✓
- Non-repeatable: ✓
- Phantom: ✗
- MySQL default
Serializable
- Dirty read: ✓
- Non-repeatable: ✓
- Phantom: ✓
- Strongest, slowest
Locking
Pessimistic Locking
"আগেই lock করি, পরে কাজ করি।" Transaction শুরুতে row lock — অন্য transaction wait।
- Conflict-প্রবণ workload-এ ভালো।
- Deadlock-এর risk।
Optimistic Locking
"Hopefully conflict হবে না।" Transaction শেষে check করে commit।
- Conflict-rare workload-এ ভালো।
- Retry logic দরকার।
Deadlock
দুই transaction পরস্পরের lock-এর জন্য wait করছে — কেউই এগোতে পারছে না।
সমাধান
- Detection: DB cycle detect করে — একটি transaction kill।
- Prevention: Lock-এর order consistent রাখা।
- Timeout: Wait limit সেট।
MVCC (Multi-Version Concurrency Control)
আধুনিক DB (PostgreSQL, Oracle) — lock-এর বদলে multi-version data রাখে। Read transaction পুরাতন version-এ কাজ করে; write transaction নতুন version তৈরি।
- সুবিধা: Read এবং write একে অপরকে block করে না।
- অসুবিধা: Storage বেশি (multiple version), VACUUM-এর দরকার।
বাস্তব উদাহরণ
- Banking transfer: Strict serializable transaction।
- Booking.com: Pessimistic lock — double booking নয়।
- GitHub PR: Optimistic lock (version field)।
- E-commerce: Mixed — payment ACID, view eventual।
সাধারণ ভুল ধারণা
- "Higher isolation always better": না — slower, less throughput।
- "Transaction = backup": না — durable kintu commit-এর পর single source।
- "Long transaction OK": না — lock-এ অন্যদের আটকে রাখে।
Best Practices
- Transaction যত ছোট ততই ভালো।
- Network call (API, email) transaction-এ এড়িয়ে চলুন।
- Isolation level minimum যেটা যথেষ্ট।
- Always handle ROLLBACK on error।
- Long-running query separate করুন।
- Index দিন lock contention কমাতে।
📌 চ্যাপ্টার সারমর্ম
- Transaction = atomic operation unit (ACID)।
- COMMIT permanent; ROLLBACK undo।
- Isolation level prevent করে dirty/non-repeatable/phantom read।
- Pessimistic vs Optimistic locking।
- Modern DB MVCC দিয়ে read-write parallel।