ACID কী?
ACID হলো ডেটাবেজ Transaction-এর চারটি মূল বৈশিষ্ট্যের সমষ্টি যা ডেটার নির্ভরযোগ্যতা ও সঠিকতা নিশ্চিত করে। এই চারটি বৈশিষ্ট্য হলো: Atomicity, Consistency, Isolation, এবং Durability।
A — Atomicity (পরমাণুতা)
"সব কিছু অথবা কিছুই নয়" — একটি Transaction-এর সব অপারেশন হয় সম্পূর্ণভাবে সম্পন্ন হবে, না হলে একটিও হবে না।
উদাহরণ:
BEGIN TRANSACTION;
-- ধাপ ১: Account A থেকে কাটা
UPDATE accounts SET balance = balance - 5000 WHERE id = 1;
-- ধাপ ২: Account B-তে যোগ (এখানে সার্ভার ক্র্যাশ করলো!)
UPDATE accounts SET balance = balance + 5000 WHERE id = 2;
COMMIT;
Atomicity ছাড়া: A থেকে টাকা কাটা গেল কিন্তু B-তে গেল না! Atomicity সহ: উভয় ধাপ ব্যর্থ হলে পুরো Transaction ROLLBACK হয়।
Spring Boot-এ Atomicity:
@Transactional // পুরো মেথড একটি Atomic Unit
public void transferMoney(Long fromId, Long toId, double amount) {
Account from = accountRepository.findById(fromId).get();
Account to = accountRepository.findById(toId).get();
from.setBalance(from.getBalance() - amount);
to.setBalance(to.getBalance() + amount);
accountRepository.save(from);
accountRepository.save(to);
// যেকোনো Exception → পুরো Transaction ROLLBACK
}
C — Consistency (সামঞ্জস্য)
Transaction সম্পন্ন হলে ডেটাবেজ সবসময় Valid State-এ থাকবে। Business Rules এবং Constraints কখনো ভাঙবে না।
উদাহরণ:
-- Rule: balance কখনো Negative হতে পারবে না
ALTER TABLE accounts ADD CONSTRAINT chk_balance CHECK (balance >= 0);
-- এই Transaction Fail করবে (Consistency রক্ষা করবে)
BEGIN;
UPDATE accounts SET balance = balance - 10000 WHERE id = 1; -- balance হবে -5000 (ভুল!)
COMMIT; -- ERROR: balance < 0 নয় — Constraint Violation!
Spring Boot-এ Consistency:
@Entity
public class Account {
@Id
private Long id;
@Column(name = "balance")
@Min(value = 0, message = "Balance cannot be negative")
private double balance;
// Constraint validation নিশ্চিত করে Consistency
}
I — Isolation (বিচ্ছিন্নতা)
একাধিক Transaction একসাথে চললেও প্রতিটি Transaction এমনভাবে চলবে যেন সে একাই চলছে। একটি Transaction-এর Intermediate State অন্য Transaction দেখতে পাবে না।
Isolation ছাড়া সমস্যা:
Transaction A: balance = 1000 পড়লো
Transaction B: balance = 1000 পড়লো (একই সময়ে!)
Transaction A: balance = 1000 + 500 = 1500 করে Commit করলো
Transaction B: balance = 1000 + 300 = 1300 করে Commit করলো (A-এর পরিবর্তন হারালো!)
Final: balance = 1300 (ভুল! হওয়া উচিত ছিল 1800)
Isolation Level:
@Transactional(isolation = Isolation.SERIALIZABLE)
public void criticalOperation() {
// সর্বোচ্চ Isolation — সব Concurrency সমস্যা প্রতিরোধ
}
@Transactional(isolation = Isolation.READ_COMMITTED)
public void normalOperation() {
// Dirty Read প্রতিরোধ (সাধারণ ব্যবহারের জন্য)
}
D — Durability (স্থায়িত্ব)
একবার Transaction COMMIT হলে ডেটা স্থায়ীভাবে সংরক্ষিত হয়। সার্ভার ক্র্যাশ, Power failure বা অন্য যেকোনো সমস্যায়ও ডেটা হারাবে না।
Durability কিভাবে নিশ্চিত হয়?
Write-Ahead Logging (WAL):
1. Transaction Commit হওয়ার আগে Log File-এ লেখা হয়
2. তারপর Disk-এ Write হয়
3. সার্ভার ক্র্যাশ করলে Log থেকে Recovery হয়
PostgreSQL WAL:
wal_level = replica
fsync = on ← এটি অবশ্যই on রাখতে হবে
Spring Boot-এ Durability:
@Transactional
public Order placeOrder(OrderRequest request) {
Order order = new Order(request);
Order saved = orderRepository.save(order);
// COMMIT হলে এই ডেটা সার্ভার রিস্টার্ট করলেও থাকবে
return saved;
}
ACID সম্পূর্ণ উদাহরণ
Bank Transfer (সব ACID বৈশিষ্ট্য):
@Service
public class BankTransferService {
@Transactional // ACID নিশ্চিত করে
public TransferResult transfer(Long fromId, Long toId, double amount) {
// CONSISTENCY: Validation (Balance >= 0 নিশ্চিত করা)
Account from = accountRepository.findById(fromId)
.orElseThrow(() -> new AccountNotFoundException("Sender not found"));
Account to = accountRepository.findById(toId)
.orElseThrow(() -> new AccountNotFoundException("Receiver not found"));
if (from.getBalance() < amount) {
throw new InsufficientFundsException("Insufficient balance");
}
// ATOMICITY: উভয় Update একসাথে হবে অথবা কোনোটাই হবে না
from.setBalance(from.getBalance() - amount);
to.setBalance(to.getBalance() + amount);
accountRepository.save(from);
accountRepository.save(to);
// ISOLATION: এই পরিবর্তন অন্য Transaction Commit হওয়ার আগে দেখবে না
// DURABILITY: COMMIT হলে সার্ভার ক্র্যাশ হলেও ডেটা থাকবে
return new TransferResult(from.getBalance(), to.getBalance());
}
}
BASE vs ACID
NoSQL ডেটাবেজে প্রায়ই BASE ব্যবহার হয়:
| বৈশিষ্ট্য | ACID | BASE |
|---|---|---|
| উদ্দেশ্য | Strong Consistency | High Availability |
| ব্যবহার | RDBMS (MySQL, PostgreSQL) | NoSQL (MongoDB, Cassandra) |
| Consistency | Strict (সবসময়) | Eventual (পরে) |
| Availability | কম (Lock থাকে) | বেশি |
| উদাহরণ | Banking, Finance | Social Media, Analytics |
সংক্ষেপে
| বৈশিষ্ট্য | মানে | উদ্দেশ্য |
|---|---|---|
| Atomicity | সব অথবা কিছুই নয় | আংশিক Update প্রতিরোধ |
| Consistency | Valid State বজায় রাখা | Data Integrity নিশ্চিত |
| Isolation | Transaction পরস্পর বিচ্ছিন্ন | Concurrency সমস্যা প্রতিরোধ |
| Durability | Commit = স্থায়ী | Data loss প্রতিরোধ |
উপসংহার
ACID বৈশিষ্ট্যগুলো ডেটাবেজ নির্ভরযোগ্যতার ভিত্তি। ব্যাংকিং, ই-কমার্স, স্বাস্থ্যসেবা সহ যেকোনো Critical অ্যাপ্লিকেশনে ACID অপরিহার্য। Spring Boot-এ @Transactional Annotation ব্যবহার করলে JPA/Hibernate এই চারটি বৈশিষ্ট্য স্বয়ংক্রিয়ভাবে নিশ্চিত করে।