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 এই চারটি বৈশিষ্ট্য স্বয়ংক্রিয়ভাবে নিশ্চিত করে।

Share