Part 2 · ডেটাবেস 📖 ১৪ মিনিট পড়া 📝 ২০টি কুইজ

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

BEGIN TRANSACTION; UPDATE accounts SET balance = balance - 1000 WHERE id = 1; UPDATE accounts SET balance = balance + 1000 WHERE id = 2; COMMIT; -- বা ভুল হলে ROLLBACK;

ACID-এর সারমর্ম

Transaction-এর গুরুত্বের কারণ ACID:

  • A: Atomic — সব হবে বা কিছুই না।
  • C: Consistent — DB rule সব সময় valid।
  • I: Isolated — concurrent transaction interfere করবে না।
  • D: Durable — commit-এর পর permanent।

Transaction States

  1. Active: Transaction চলছে।
  2. Partially Committed: শেষ statement execute, কিন্তু এখনো disk-এ লেখা হয়নি।
  3. Committed: সফলভাবে শেষ — disk-এ লেখা।
  4. Failed: কোনো সমস্যায় execute করা যায়নি।
  5. Aborted: Rollback হয়ে গেছে।

COMMIT vs ROLLBACK

COMMIT

Transaction-এর সব change permanent করা। Disk-এ WAL মাধ্যমে durable করা হয়। এক বার commit হলে — আর rollback নেই।

ROLLBACK

Transaction-এর সব change বাতিল। DB transaction-এর শুরুতে যে state ছিল — সে অবস্থায় ফিরে।

Savepoints

বড় transaction-এ মাঝখানে checkpoint:

BEGIN TRANSACTION; INSERT INTO orders ...; SAVEPOINT after_order; UPDATE inventory ...; -- যদি সমস্যা হয়: ROLLBACK TO SAVEPOINT after_order; -- order intact, inventory rollback COMMIT;

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।

SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- এই row lock until commit/rollback
  • Conflict-প্রবণ workload-এ ভালো।
  • Deadlock-এর risk।

Optimistic Locking

"Hopefully conflict হবে না।" Transaction শেষে check করে commit।

UPDATE accounts SET balance = 500, version = version + 1 WHERE id = 1 AND version = 5; -- 0 rows affected = অন্য কেউ আগে update করেছে
  • Conflict-rare workload-এ ভালো।
  • Retry logic দরকার।

Deadlock

দুই transaction পরস্পরের lock-এর জন্য wait করছে — কেউই এগোতে পারছে না।

T1: lock(A); ... wait for B T2: lock(B); ... wait for A

সমাধান

  • 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।

সাধারণ ভুল ধারণা

  1. "Higher isolation always better": না — slower, less throughput।
  2. "Transaction = backup": না — durable kintu commit-এর পর single source।
  3. "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।