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-এর IDxmax— 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 সর্বোচ্চ দক্ষতায় কাজ করে।