MVCC (Multi-Version Concurrency Control) কী?

MVCC হলো একটি Concurrency Control পদ্ধতি যেখানে ডেটার একাধিক Version একসাথে রাখা হয়। এটি Reader ও Writer-এর মধ্যে Conflict এড়ায় — Read করার সময় Lock লাগে না, Write করার সময়ও Read Block হয় না।

MVCC PostgreSQL, MySQL InnoDB, Oracle সহ বেশিরভাগ আধুনিক ডেটাবেজ ব্যবহার করে।


MVCC ছাড়া সমস্যা কী?

Lock-based system-এ:

  • Writer যখন Row Update করছে → Reader অপেক্ষা করতে হয়
  • Reader যখন Row পড়ছে → Writer অপেক্ষা করতে হয়
  • এতে Performance কমে, Deadlock হওয়ার ঝুঁকি বাড়ে

MVCC-তে:

  • Writer নতুন Version তৈরি করে, পুরনো Version রেখে দেয়
  • Reader সেই Consistent পুরনো Version পড়ে — কোনো Lock লাগে না
  • Writer ও Reader একসাথে কাজ করে

MVCC কিভাবে কাজ করে?

প্রতিটি Row-এ Transaction ID থাকে

PostgreSQL-এ প্রতিটি Row-এ দুটি hidden field থাকে:

  • xmin — Row তৈরি করা Transaction-এর ID
  • xmax — Row মুছে দেওয়া বা Update করা Transaction-এর ID (নেই হলে 0)
-- PostgreSQL-এ hidden fields দেখতে
SELECT xmin, xmax, id, name, balance FROM accounts WHERE id = 1;

Update-এর সময় কী হয়?

মূল Row:  id=1, balance=1000, xmin=100, xmax=0

Transaction 200 balance = 800 করে:
    পুরনো Row: id=1, balance=1000, xmin=100, xmax=200  (expired)
    নতুন Row:  id=1, balance=800,  xmin=200, xmax=0    (current)

Transaction 150 (আগের Snapshot নিয়েছে) এখনো balance=1000 দেখবে!

MVCC Snapshot

প্রতিটি Transaction শুরুতে একটি Snapshot নেয়:

  • কোন Transaction-গুলো Commit হয়েছে তার তালিকা রাখে
  • সেই Snapshot অনুযায়ী কোন Version দেখবে তা নির্ধারণ করে
Transaction A (Snapshot: xmin=1-99 visible):
    accounts দেখছে → balance=1000 দেখে (xmin=100 এর আগের version)

Transaction B (Snapshot: xmin=1-200 visible):  
    accounts দেখছে → balance=800 দেখে (xmin=200 এর নতুন version)

MVCC এবং Isolation Level

MVCC দিয়ে বিভিন্ন Isolation Level পরিচালিত হয়:

-- READ COMMITTED: প্রতি Statement-এ নতুন Snapshot
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- Snapshot 1: 1000
-- (অন্য Transaction Update করে Commit করলো)
SELECT balance FROM accounts WHERE id = 1;  -- Snapshot 2: 800 (নতুন দেখছে)
COMMIT;

-- REPEATABLE READ: Transaction-এর শুরুতে একটি Snapshot
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- Snapshot: 1000
-- (অন্য Transaction Update করে Commit করলো)
SELECT balance FROM accounts WHERE id = 1;  -- একই Snapshot: 1000 (পরিবর্তন দেখছে না!)
COMMIT;

MVCC-এর সুবিধা ও অসুবিধা

সুবিধা:

  • No Read Lock: Read করার সময় Lock লাগে না
  • High Concurrency: Read ও Write একসাথে চলে
  • Consistent Snapshot: Transaction-এ ডেটার Consistent View পাওয়া যায়
  • No Deadlock (for reads): Read অপারেশনে Deadlock হয় না

অসুবিধা:

  • Storage বেশি লাগে: পুরনো Version সংরক্ষণ করতে হয়
  • Vacuum/Cleanup দরকার: পুরনো Expired Version মুছতে হয়
  • Write-Write Conflict: দুটি Transaction একই Row Update করলে Conflict হয়

PostgreSQL-এ VACUUM

PostgreSQL-এ পুরনো Row Version পরিষ্কার করতে VACUUM ব্যবহার হয়:

-- Manual Vacuum
VACUUM accounts;

-- Full Vacuum (বেশি সময় লাগে, ডেটা Compact করে)
VACUUM FULL accounts;

-- Auto-analyze সহ
VACUUM ANALYZE accounts;

-- Autovacuum সক্রিয় আছে কিনা দেখুন
SELECT name, setting FROM pg_settings WHERE name LIKE 'autovacuum%';

Spring Boot এবং MVCC

MVCC ডেটাবেজ ইঞ্জিনে কাজ করে — Spring Boot-এ এটি Transparent। তবে @Transactional দিয়ে Isolation Level নির্ধারণ করলে MVCC Snapshot অনুযায়ী ডেটা পড়া হয়।

@Service
public class InventoryService {

    // REPEATABLE_READ: পুরো মেথডে MVCC একই Snapshot ব্যবহার করবে
    @Transactional(isolation = Isolation.REPEATABLE_READ)
    public void processInventory(Long productId) {
        Product product = productRepository.findById(productId).get();
        int currentStock = product.getStock();  // MVCC Snapshot থেকে পড়ছে

        // কিছু হিসাব...
        int newStock = calculateNewStock(currentStock);

        product.setStock(newStock);
        productRepository.save(product);
        // Transaction শেষে নতুন Version তৈরি হয়
    }

    // READ_COMMITTED: প্রতিটি Query নতুন Snapshot নেয়
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public List<Product> getLowStockProducts() {
        // প্রতিটি Query সর্বশেষ Committed ডেটা দেখে
        return productRepository.findByStockLessThan(10);
    }
}

সংক্ষেপে

বিষয় বিবরণ
MVCC কী ডেটার একাধিক Version রেখে Concurrency পরিচালনা
মূল সুবিধা Read ও Write একসাথে Lock ছাড়াই চলে
Snapshot Transaction শুরুতে নেওয়া Consistent View
xmin/xmax PostgreSQL-এ প্রতিটি Row-এর Version tracking
VACUUM PostgreSQL-এ পুরনো Version পরিষ্কারের প্রক্রিয়া
Isolation MVCC দিয়ে READ COMMITTED ও REPEATABLE READ পরিচালিত হয়

উপসংহার

MVCC আধুনিক ডেটাবেজ সিস্টেমের একটি মূল প্রযুক্তি যা High Concurrency এবং Data Consistency একসাথে নিশ্চিত করে। এটি বোঝা ডেটাবেজ Performance Tuning ও Troubleshooting-এর জন্য অত্যন্ত গুরুত্বপূর্ণ। Spring Boot অ্যাপ্লিকেশনে সঠিক Isolation Level নির্বাচন করলে MVCC সর্বোচ্চ দক্ষতায় কাজ করে।

Share