ACID হল একটি ডেটাবেস ট্রানজেকশনের চারটি মূল গুণাবলী, যা ডেটাবেসের কার্যকারিতা, নির্ভরযোগ্যতা এবং সঠিকতা নিশ্চিত করে। ACID এর পুরো রূপ হলো:
- Atomicity (অ্যাটমিকিটি)
- Consistency (সামঞ্জস্য)
- Isolation (স্বতন্ত্রতা)
- Durability (স্থায়িত্ব)
এই প্রোপার্টিগুলির মাধ্যমে ডেটাবেস ট্রানজেকশনগুলো নিশ্চিত করা হয় যে, একাধিক অপারেশন সঠিকভাবে এবং নির্ভরযোগ্যভাবে সম্পন্ন হবে। JPA (Java Persistence API) তে ট্রানজেকশনের সঠিক বাস্তবায়ন এই ACID প্রোপার্টি নিশ্চিত করতে সহায়ক।
১. Atomicity (অ্যাটমিকিটি)
Atomicity প্রোপার্টি অনুযায়ী, একটি ট্রানজেকশনের মধ্যে যদি একাধিক অপারেশন থাকে, তবে সেগুলি একসাথে সফলভাবে সম্পন্ন হতে হবে অথবা পুরো ট্রানজেকশনটি বাতিল হয়ে যাবে। যদি কোন কারণে ট্রানজেকশনটি ব্যর্থ হয়, তাহলে পূর্বের সব অপারেশন রোলব্যাক হয়ে যাবে।
JPA তে Atomicity:
JPA-তে EntityManager ব্যবহার করে আপনি ট্রানজেকশন পরিচালনা করেন, এবং JTA (Java Transaction API) ব্যবহার করে আপনি ট্রানজেকশনগুলোকে একত্রিত বা বাতিল করতে পারেন। যখন একটি ট্রানজেকশনে একাধিক অপারেশন থাকে, তখন begin(), commit(), এবং rollback() মেথডের মাধ্যমে নিশ্চিত করা হয় যে সমস্ত অপারেশন একত্রে সফল হবে, অথবা ব্যর্থ হলে সব অপারেশন বাতিল হয়ে যাবে।
উদাহরণ:
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
public class EmployeeService {
private EntityManager entityManager;
public void saveEmployee(Employee employee) {
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
entityManager.persist(employee); // Atomic operation (persist)
transaction.commit(); // Commit transaction if successful
} catch (RuntimeException e) {
if (transaction.isActive()) {
transaction.rollback(); // Rollback if something goes wrong
}
throw e; // Rethrow exception
}
}
}
Explanation:
- transaction.begin(): ট্রানজেকশন শুরু করা হয়।
- transaction.commit(): যদি সব অপারেশন সফল হয়, তবে ট্রানজেকশন কমিট করা হয়।
- transaction.rollback(): কোনো ত্রুটি হলে সমস্ত অপারেশন বাতিল করতে রোলব্যাক করা হয়।
২. Consistency (সামঞ্জস্য)
Consistency প্রোপার্টি অনুযায়ী, ট্রানজেকশনটি ডেটাবেসকে একটি সঠিক এবং স্বীকৃত অবস্থায় রাখবে। অর্থাৎ, ট্রানজেকশন শুরু হওয়ার আগে যেই ডেটা ছিল, ট্রানজেকশন শেষ হওয়ার পর সেই ডেটা সামঞ্জস্যপূর্ণ থাকবে এবং কোনো অবৈধ বা ভুল অবস্থায় চলে যাবে না।
JPA তে Consistency:
JPA-তে @Transactional অ্যানোটেশন বা JTA ব্যবহার করে নিশ্চিত করা হয় যে ডেটাবেসের মধ্যে ডেটা সর্বদা কনসিস্টেন্ট থাকে। একাধিক ট্রানজেকশন চলতে থাকলেও ডেটাবেসের নীতিমালা অনুযায়ী ডেটা সঠিক থাকবে।
উদাহরণ:
import javax.persistence.EntityTransaction;
import javax.persistence.EntityManager;
public class AccountService {
private EntityManager entityManager;
public void transferMoney(Account fromAccount, Account toAccount, double amount) {
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
fromAccount.setBalance(fromAccount.getBalance() - amount);
toAccount.setBalance(toAccount.getBalance() + amount);
entityManager.merge(fromAccount);
entityManager.merge(toAccount);
transaction.commit(); // Ensure consistency after the transfer
} catch (RuntimeException e) {
if (transaction.isActive()) {
transaction.rollback();
}
throw e;
}
}
}
Explanation:
- EntityTransaction এর মাধ্যমে অ্যাকাউন্টের মধ্যে অর্থ স্থানান্তর করার জন্য একটি ট্রানজেকশন পরিচালিত হচ্ছে।
- @Transactional বা transaction.commit() ডেটাবেসে একাধিক অপারেশন (যেমন, দুটি অ্যাকাউন্টে ব্যালেন্স আপডেট) করার পর সঠিকভাবে ডেটা কনসিস্টেন্ট রেখে ট্রানজেকশন কমিট করা হয়।
৩. Isolation (স্বতন্ত্রতা)
Isolation প্রোপার্টি অনুযায়ী, একটি ট্রানজেকশন অন্য ট্রানজেকশনের প্রভাব থেকে স্বতন্ত্রভাবে কাজ করবে, এবং একে অপরকে প্রভাবিত করবে না। অর্থাৎ, একাধিক ট্রানজেকশন যদি একই ডেটা পরিবর্তন করতে চেষ্টা করে, তবে তাদের মধ্যে একটি নির্দিষ্ট স্বতন্ত্রতা থাকবে এবং ডেটার অবস্থা সঠিক থাকবে।
JPA তে Isolation:
JPA তে EntityManager এবং JTA ব্যবহার করে ট্রানজেকশনগুলির মধ্যে একে অপরের উপর প্রভাব কমিয়ে আনা হয়। JPA transaction isolation levels সমর্থন করে, যেমন READ_COMMITTED, SERIALIZABLE, REPEATABLE_READ, ইত্যাদি। এই লেভেলগুলির মাধ্যমে নির্দিষ্ট ট্রানজেকশন আইসোলেশন কনফিগার করা যায়।
উদাহরণ:
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
public class TransactionIsolationExample {
private EntityManager entityManager;
public void transferMoneyWithIsolation(Account fromAccount, Account toAccount, double amount) {
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
// Set isolation level to SERIALIZABLE
entityManager.createQuery("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE").executeUpdate();
fromAccount.setBalance(fromAccount.getBalance() - amount);
toAccount.setBalance(toAccount.getBalance() + amount);
entityManager.merge(fromAccount);
entityManager.merge(toAccount);
transaction.commit();
} catch (RuntimeException e) {
if (transaction.isActive()) {
transaction.rollback();
}
throw e;
}
}
}
Explanation:
- Isolation Level: এখানে
SERIALIZABLEআইসোলেশন লেভেল সেট করা হয়েছে, যা ট্রানজেকশনের মধ্যে সবচেয়ে শক্তিশালী লক ম্যানেজমেন্ট প্রদান করে এবং ডেটা কনফ্লিক্ট বন্ধ করে।
৪. Durability (স্থায়িত্ব)
Durability প্রোপার্টি অনুযায়ী, একটি ট্রানজেকশনের পরে তার পরিবর্তনগুলো স্থায়ীভাবে ডেটাবেসে সংরক্ষিত থাকবে, এমনকি সিস্টেম ক্র্যাশ হলেও। অর্থাৎ, একবার ট্রানজেকশন commit হয়ে গেলে তার পরিবর্তন ফিরে আসবে না।
JPA তে Durability:
JPA তে commit হওয়া ট্রানজেকশন ডেটাবেসে স্থায়ীভাবে সংরক্ষিত হয়। JTA এর মাধ্যমে প্রতিটি ট্রানজেকশন নিশ্চিত হয় যে একবার commit হলে ডেটা স্থায়ী হয়।
উদাহরণ:
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
public class AccountService {
private EntityManager entityManager;
public void depositMoney(Account account, double amount) {
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
account.setBalance(account.getBalance() + amount);
entityManager.merge(account); // Commit changes to database
transaction.commit(); // Once committed, changes are permanent (Durable)
} catch (RuntimeException e) {
if (transaction.isActive()) {
transaction.rollback();
}
throw e;
}
}
}
Explanation:
- commit(): যখন ট্রানজেকশন কমিট হয়, তখন সমস্ত পরিবর্তন durable হয়ে যায়, অর্থাৎ সেগুলি ডেটাবেসে স্থায়ীভাবে সংরক্ষিত হয়।
সারাংশ
ACID প্রোপার্টি (Atomicity, Consistency, Isolation, Durability) ডেটাবেস ট্রানজেকশনের জন্য অত্যন্ত গুরুত্বপূর্ণ, এবং JPA তে এই প্রোপার্টিগুলি সঠিকভাবে বাস্তবায়ন করা হয়। JPA তে EntityManager এবং JTA ব্যবহার করে ডেটাবেসে কার্যকরী এবং নির্ভরযোগ্য ট্রানজেকশন পরিচালনা করা হয়:
- Atomicity:
commit()এবংrollback()এর মাধ্যমে একটি ট্রানজেকশনের সমস্ত অপারেশন একত্রে সফল বা ব্যর্থ হয়। - Consistency: ট্রানজেকশনটি ডেটাবেসের কনসিস্টেন্ট অবস্থান বজায় রাখে।
- Isolation: একাধিক ট্রানজেকশন একে অপরের মধ্যে প্রভাব ফেলবে না।
- Durability: ট্রানজেকশন কমিট হওয়ার পর তার পরিবর্তনগুলো স্থায়ীভাবে ডেটাবেসে সেভ হয়।
এগুলি নিশ্চিত করে যে ডেটাবেস ট্রানজেকশনগুলো সঠিকভাবে, নির্ভরযোগ্যভাবে এবং স্থায়ীত্বসহ পরিচালিত হচ্ছে।
Read more