JPA (Java Persistence API) এবং Spring Framework-এ Transaction Management হল একটি গুরুত্বপূর্ণ বিষয়, যার মাধ্যমে ডেটাবেস অপারেশনগুলি একটি একক ইউনিট হিসেবে সম্পন্ন করা হয়। @Transactional এনোটেশনটি Spring Framework-এ ট্রানজেকশন ম্যানেজমেন্টের জন্য ব্যবহৃত হয় এবং এটি ডেটাবেসে একাধিক অপারেশনকে একটি ট্রানজেকশনে অন্তর্ভুক্ত করে।
@Transactional এনোটেশন ব্যবহার করে, আপনি নিশ্চিত করতে পারেন যে ডেটাবেসে বিভিন্ন অপারেশন একটি একক ট্রানজেকশনের মধ্যে সম্পাদিত হবে, এবং কোনো ত্রুটি হলে সব অপারেশন রোলব্যাক হবে। এটি ডেটাবেসের Atomicity, Consistency, Isolation, এবং Durability (ACID properties) নিশ্চিত করতে সহায়তা করে।
@Transactional এনোটেশন এর বৈশিষ্ট্য
- Atomicity: ট্রানজেকশনের মধ্যে সব অপারেশন একসাথে বা কিছুই না হওয়া নিশ্চিত করা হয়।
- Consistency: ডেটাবেসের ইনটিগ্রিটি নিশ্চিত করা হয়।
- Isolation: একাধিক ট্রানজেকশন একে অপরকে প্রভাবিত না করে চলতে পারে।
- Durability: একটি সফল ট্রানজেকশন শেষ হলে, তার পরিবর্তন স্থায়ী হয়ে যাবে।
@Transactional এনোটেশন দ্বারা আপনি কনফিগার করতে পারেন:
- কিভাবে ট্রানজেকশন ম্যানেজ করা হবে (যেমন
REQUIRED,REQUIRES_NEW,MANDATORYইত্যাদি)। - কোন কোন মেথড বা ক্লাসে ট্রানজেকশন পরিচালিত হবে।
১. @Transactional এনোটেশন ব্যবহার
@Transactional এনোটেশনটি আপনার সেবা (Service) লেয়ার বা DAO (Data Access Object) লেয়ারে ব্যবহার করা হয়। এটি স্বয়ংক্রিয়ভাবে আপনার পদ্ধতিগুলির জন্য ট্রানজেকশন তৈরি করে, এবং যখন সেগুলি সফলভাবে সম্পন্ন হয়, তখন সেই পরিবর্তনগুলি ডেটাবেসে commit হয়। যদি কোনো ত্রুটি হয়, তবে সমস্ত পরিবর্তন রোলব্যাক হয়ে যায়।
@Transactional উদাহরণ:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class EmployeeService {
@Transactional
public void addEmployeeAndDepartment(Employee employee, Department department) {
// Add Employee
employeeRepository.save(employee);
// Add Department
departmentRepository.save(department);
// Both these operations will be wrapped in a single transaction
}
}
এখানে:
@Transactional:addEmployeeAndDepartment()মেথডের জন্য একটি ট্রানজেকশন তৈরি করা হবে। অর্থাৎ, যখন Employee এবং Department Entity গুলো ডেটাবেসে সেভ হবে, তখন যদি কোনো একটি অপারেশন ব্যর্থ হয়, তখন সব অপারেশন রোলব্যাক হবে।
২. @Transactional এর বিভিন্ন গুণাবলী
Propagation:
- Propagation ট্রানজেকশনের আচরণ নির্ধারণ করে। যদি একটি ট্রানজেকশন অন্য একটি ট্রানজেকশনের মধ্যে চলে আসে, তবে তার আচরণ কী হবে তা নির্ধারণ করে।
উদাহরণ:
REQUIRED(ডিফল্ট): যদি ট্রানজেকশন চলমান থাকে, তবে এটি সেই ট্রানজেকশনের মধ্যে চলে যাবে, অন্যথায় নতুন ট্রানজেকশন শুরু করবে।REQUIRES_NEW: নতুন ট্রানজেকশন শুরু করবে, যদি পূর্বের ট্রানজেকশন থাকে, তবে সেটি সাসপেন্ড হবে।
Isolation:
- Isolation ডেটাবেস ট্রানজেকশনের মধ্যে একাধিক ট্রানজেকশনকে আলাদা রাখতে সহায়তা করে, যাতে তারা একে অপরকে প্রভাবিত না করে।
উদাহরণ:
READ_COMMITTED: একাধিক ট্রানজেকশন যদি একই রেকর্ডে কাজ করে, তবে কেবলমাত্র অন্য ট্রানজেকশনটি সম্পন্ন হলে তা আপডেট করা যাবে।SERIALIZABLE: একাধিক ট্রানজেকশন সম্পূর্ণভাবে আলাদা হবে এবং একে অপরের মধ্যে কোনো সংঘর্ষ ঘটবে না।
Rollback Rules:
- আপনি কোন Exception এর জন্য ট্রানজেকশন রোলব্যাক করবেন তা নির্ধারণ করতে পারেন।
৩. @Transactional এর বিভিন্ন গুণাবলী উদাহরণ
Propagation উদাহরণ:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateEmployeeAndDepartment(Employee employee, Department department) {
// This method will execute in a new transaction, suspending any existing transaction
employeeRepository.save(employee);
departmentRepository.save(department);
}
এখানে:
Propagation.REQUIRES_NEWব্যবহার করে, একটি নতুন ট্রানজেকশন তৈরি করা হবে, এবং পূর্বের ট্রানজেকশনটি সাসপেন্ড করা হবে।
Isolation উদাহরণ:
@Transactional(isolation = Isolation.SERIALIZABLE)
public void updateEmployeeSalary(Long employeeId, Double salary) {
Employee employee = employeeRepository.findById(employeeId);
employee.setSalary(salary);
employeeRepository.save(employee);
}
এখানে:
Isolation.SERIALIZABLEব্যবহার করে, আমরা নিশ্চিত করতে পারি যে একাধিক ট্রানজেকশন একে অপরকে প্রভাবিত করবে না এবং সঠিকভাবে কাজ করবে।
Rollback Rules উদাহরণ:
@Transactional(rollbackFor = Exception.class)
public void updateEmployeeInfo(Employee employee) throws Exception {
employeeRepository.save(employee);
// If any exception occurs, the transaction will be rolled back
if (employee.getName() == null) {
throw new Exception("Employee name cannot be null");
}
}
এখানে:
rollbackFor = Exception.classব্যবহার করে, যদি কোনোExceptionহয় তবে ট্রানজেকশন রোলব্যাক হবে।
৪. Spring-এ @Transactional এর কিছু সাধারণ ব্যবহার
Service Layer এ ট্রানজেকশন ম্যানেজমেন্ট:
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
@Autowired
private PaymentService paymentService;
@Transactional
public void processOrder(Order order) {
// Save the order
orderRepository.save(order);
// Process the payment (if payment fails, rollback the transaction)
paymentService.processPayment(order);
}
}
এখানে:
processOrderমেথডে@Transactionalব্যবহৃত হয়েছে। এটি নিশ্চিত করে যে যদি paymentService এ কোনো ত্রুটি হয়, তবে orderRepository-তে করা পরিবর্তন রোলব্যাক হবে।
সারাংশ
@Transactional এনোটেশন Spring Framework এ ট্রানজেকশন পরিচালনার জন্য ব্যবহৃত হয়। এটি আপনাকে একাধিক ডেটাবেস অপারেশনকে একটি একক ট্রানজেকশনে অন্তর্ভুক্ত করতে সহায়তা করে এবং ডেটাবেসে একাধিক অপারেশন সফলভাবে সম্পন্ন হলে কেবলমাত্র commit হয়, অন্যথায় সব অপারেশন রোলব্যাক হয়ে যায়। @Transactional এনোটেশন propagation, isolation, এবং rollback rules এর মতো গুরুত্বপূর্ণ গুণাবলী সরবরাহ করে, যা জটিল ট্রানজেকশন ম্যানেজমেন্ট সহজ করে তোলে।
Read more