@Transactional অ্যানোটেশনটি স্প্রিং ফ্রেমওয়ার্কে ট্রানজেকশন ম্যানেজমেন্ট (Transaction Management) পরিচালনার জন্য ব্যবহৃত হয়। এটি ডেটাবেস অপারেশনগুলিকে একটি ইউনিট অফ ওয়ার্ক (Unit of Work) হিসেবে পরিচালনা করে, যেখানে সমস্ত কাজ সফলভাবে সম্পন্ন হলে ডেটাবেসে পরিবর্তনগুলো কার্যকর করা হয়। কোনো ত্রুটি ঘটলে সম্পূর্ণ ট্রানজেকশন বাতিল (Rollback) হয়ে যায়।
@Transactional Annotation কী?
@Transactional অ্যানোটেশন ব্যবহার করে স্প্রিং কনটেইনারকে নির্দেশ করা হয় যে, নির্দিষ্ট মেথড বা ক্লাসের মধ্যে থাকা সমস্ত ডেটাবেস অপারেশন একটি ট্রানজেকশনের অংশ। এটি সাধারণত ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশনের সময় ব্যবহার করা হয়।
@Transactional Annotation এর মূল বৈশিষ্ট্য
- অটোমেটিক রোলব্যাক (Automatic Rollback): কোনো ব্যতিক্রম ঘটলে ট্রানজেকশন রোলব্যাক হয়।
- কনফিগারেশন সিম্পলিসিটি: XML বা প্রোগ্রাম্যাটিক কনফিগারেশনের প্রয়োজন ছাড়াই ডিক্লারেটিভ ট্রানজেকশন ম্যানেজমেন্ট সহজ করে।
- পয়েন্টেড কন্ট্রোল: নির্দিষ্ট মেথড বা ক্লাসে ট্রানজেকশন প্রয়োগ করা যায়।
- নেস্টেড ট্রানজেকশন সাপোর্ট: একাধিক স্তরের ট্রানজেকশন হ্যান্ডলিংয়ের সুবিধা।
@Transactional Annotation এর ব্যবহার
মেথড লেভেলে ব্যবহার
import org.springframework.transaction.annotation.Transactional;
@Service
public class EmployeeService {
@Transactional
public void saveEmployee(Employee employee) {
// Save employee to the database
employeeRepository.save(employee);
}
}
ক্লাস লেভেলে ব্যবহার
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Service
public class EmployeeService {
public void saveEmployee(Employee employee) {
employeeRepository.save(employee);
}
public void deleteEmployeeById(int id) {
employeeRepository.deleteById(id);
}
}
ব্যাখ্যা:
- মেথড লেভেলে @Transactional ব্যবহার করলে শুধুমাত্র ওই নির্দিষ্ট মেথডের উপর ট্রানজেকশন কার্যকর হয়।
- ক্লাস লেভেলে ব্যবহার করলে ক্লাসের সমস্ত মেথড ট্রানজেকশনের অধীনে চলে আসে।
@Transactional এর প্যারামিটার
propagation
ট্রানজেকশনের প্রসার নির্ধারণ করে। উদাহরণ:
- REQUIRED: বিদ্যমান ট্রানজেকশনে যোগ দেয়, না থাকলে নতুন ট্রানজেকশন শুরু করে।
- REQUIRES_NEW: নতুন ট্রানজেকশন তৈরি করে।
- NESTED: একটি নেস্টেড ট্রানজেকশন তৈরি করে।
isolation
ডেটাবেস আইসোলেশন লেভেল নির্ধারণ করে। উদাহরণ:
- READ_COMMITTED: কেবলমাত্র কমিট হওয়া ডেটা পড়তে দেয়।
- READ_UNCOMMITTED: কমিট হওয়া বা না হওয়া উভয় ডেটা পড়তে দেয়।
- REPEATABLE_READ: একই ডেটা বারবার পড়লে একই ফলাফল দেয়।
- SERIALIZABLE: ট্রানজেকশন সিকোয়েন্সে কার্যকর হয়।
timeout
ট্রানজেকশন সম্পন্ন হওয়ার জন্য সময়সীমা নির্ধারণ করে।
rollbackFor
কোনো নির্দিষ্ট এক্সসেপশনের জন্য রোলব্যাক করার নিয়ম নির্ধারণ করে।
উদাহরণ
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, timeout = 5)
public void updateEmployee(Employee employee) {
employeeRepository.save(employee);
}
@Transactional Annotation ব্যবহার করার সুবিধা
- সহজ ট্রানজেকশন ম্যানেজমেন্ট: কোডের মধ্যে ম্যানুয়াল ট্রানজেকশন হ্যান্ডলিংয়ের প্রয়োজন নেই।
- রোলব্যাক সুবিধা: কোনো ব্যতিক্রম ঘটলে স্বয়ংক্রিয়ভাবে রোলব্যাক হয়।
- পরিষ্কার এবং পড়তে সহজ কোড: ডিক্লারেটিভ পদ্ধতিতে ট্রানজেকশন হ্যান্ডলিং করা যায়।
- ডেটা ইন্টিগ্রিটি: একাধিক ডেটাবেস অপারেশন একসাথে সফল হলে তবেই ডেটা চূড়ান্তভাবে পরিবর্তিত হয়।
উদাহরণ: @Transactional এর পূর্ণাঙ্গ ব্যবহার
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
@Transactional
public void transferSalary(int fromEmployeeId, int toEmployeeId, double amount) {
Employee fromEmployee = employeeRepository.findById(fromEmployeeId).orElseThrow();
Employee toEmployee = employeeRepository.findById(toEmployeeId).orElseThrow();
fromEmployee.setSalary(fromEmployee.getSalary() - amount);
toEmployee.setSalary(toEmployee.getSalary() + amount);
employeeRepository.save(fromEmployee);
employeeRepository.save(toEmployee);
}
}
ব্যাখ্যা:
উপরের উদাহরণে, দুটি ডেটাবেস অপারেশন (দুটি এমপ্লয়ির বেতন হালনাগাদ করা) একটি ট্রানজেকশনের অংশ। কোনো একটি অপারেশনে ব্যর্থতা ঘটলে সম্পূর্ণ ট্রানজেকশন রোলব্যাক হবে।
Read more