Eclipse IDE-এ @TransactionAttribute হল একটি অ্যানোটেশন যা Enterprise JavaBeans (EJB)-এ ব্যবহৃত হয়, এবং এটি ট্রানজেকশন ব্যবস্থাপনা নির্ধারণ করে। এটি মূলত Session Beans (Stateless, Stateful, বা Singleton) এর মধ্যে ব্যবহৃত হয় এবং এই অ্যানোটেশনটি নির্ধারণ করে যে EJB মেথডে ট্রানজেকশন কিভাবে পরিচালিত হবে।
EJB-তে @TransactionAttribute অ্যানোটেশন বিভিন্ন transaction management কৌশলগুলি কনফিগার করতে ব্যবহৃত হয়, যা ডাটাবেসের সাথে কাজ করার সময় ট্রানজেকশন চালানোর নিয়ম নির্ধারণ করে।
এখানে @TransactionAttribute এবং এর ধরন (types) নিয়ে বিস্তারিত আলোচনা করা হলো:
1. @TransactionAttribute অ্যানোটেশন
@TransactionAttribute অ্যানোটেশনটি EJB মেথডের উপর প্রযোজ্য। এটি EJB এর মধ্যে ট্রানজেকশন কিভাবে পরিচালিত হবে তা নির্ধারণ করে। এর সাহায্যে আপনি মেথড স্তরে ট্রানজেকশন আচরণ কাস্টমাইজ করতে পারেন।
Syntax:
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void someMethod() {
// business logic
}
এখানে, TransactionAttributeType ব্যবহার করা হয় মেথডের ট্রানজেকশন আচরণ নির্ধারণ করতে।
2. @TransactionAttribute এর ধরন (Types)
@TransactionAttribute অ্যানোটেশনটির ৪টি প্রধান ধরন বা transaction attribute types রয়েছে, যেগুলি আপনি আপনার EJB মেথডে ব্যবহার করতে পারেন:
2.1. REQUIRED (ডিফল্ট)
TransactionAttributeType.REQUIREDহল ডিফল্ট transaction type। যদি কোন ট্রানজেকশন চলমান না থাকে, তবে একটি নতুন ট্রানজেকশন শুরু হবে। যদি ট্রানজেকশন ইতিমধ্যেই চলমান থাকে, তবে তা ব্যবহার করা হবে।- এটি খুব সাধারণ এবং ব্যাবহারিক ক্ষেত্রে প্রচলিত।
Example:
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
public class BankingService {
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void depositMoney(Account account, double amount) {
account.deposit(amount);
}
}
এখানে, depositMoney মেথডটি যদি ট্রানজেকশন চলমান না থাকে তবে একটি নতুন ট্রানজেকশন শুরু করবে। যদি এটি চলমান থাকে, তবে একই ট্রানজেকশন ব্যবহার করবে।
2.2. REQUIRES_NEW
TransactionAttributeType.REQUIRES_NEWব্যবহার করলে, যদি একটি ট্রানজেকশন চলমান থাকে, তাহলে সেটি সাসপেন্ড হয়ে যাবে এবং একটি নতুন ট্রানজেকশন শুরু হবে। অর্থাৎ, এটি পূর্ববর্তী ট্রানজেকশন থেকে সম্পূর্ণ আলাদা একটি নতুন ট্রানজেকশন শুরু করে।- এই ধরনের ট্রানজেকশন ব্যবহৃত হয় যখন আপনি একটি মেথডে সম্পূর্ণ আলাদা ট্রানজেকশন পরিচালনা করতে চান, যা প্রধান ট্রানজেকশন থেকে স্বাধীন থাকবে।
Example:
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
public class OrderService {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void createNewOrder(Order order) {
// Start a new transaction for this method
order.save();
}
}
এখানে, createNewOrder মেথডটি নতুন ট্রানজেকশন শুরু করবে, এবং এর কার্যক্রম সম্পন্ন হওয়ার পর বর্তমান ট্রানজেকশনটি শেষ হবে।
2.3. SUPPORTS
TransactionAttributeType.SUPPORTSব্যবহার করা হলে, মেথডটি যদি চলমান ট্রানজেকশন থাকে, তবে সেটি ব্যবহার করবে। কিন্তু যদি কোন ট্রানজেকশন না থাকে, তবে মেথডটি ট্রানজেকশন ছাড়াই সম্পন্ন হবে।- সাধারণত read-only অপারেশন বা অপারেশনগুলোতে ব্যবহৃত হয় যেখানে ট্রানজেকশন প্রয়োজন নাও হতে পারে।
Example:
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
public class CustomerService {
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public Customer findCustomerById(int customerId) {
// If a transaction is active, it will be supported
return customerRepository.find(customerId);
}
}
এখানে, findCustomerById মেথডটি যদি কোনো ট্রানজেকশন চলমান থাকে তবে সেটা ব্যবহার করবে, আর যদি না থাকে, তবে এটি কোনো ট্রানজেকশন ছাড়াই চলবে।
2.4. NOT_SUPPORTED
TransactionAttributeType.NOT_SUPPORTEDব্যবহৃত হলে, মেথডটি যদি কোন ট্রানজেকশন চলমান থাকে, তবে সেটি সাসপেন্ড করে এবং মেথডটি ট্রানজেকশন ছাড়া সম্পন্ন হয়।- এই ধরনের ট্রানজেকশন ব্যবহৃত হয় যখন আপনি চান যে মেথডটি সম্পূর্ণভাবে ট্রানজেকশন মুক্ত থাকবে, এমনকি যদি একটি ট্রানজেকশন চলমান থাকে।
Example:
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
public class LoggingService {
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void logError(String errorMessage) {
// This method runs without a transaction
System.out.println("Logging error: " + errorMessage);
}
}
এখানে, logError মেথডটি কোনো ট্রানজেকশন ছাড়াই চলবে, এমনকি যদি চলমান ট্রানজেকশন থাকে।
2.5. NEVER
TransactionAttributeType.NEVERব্যবহার করলে, যদি কোন ট্রানজেকশন চলমান থাকে, তবে একটিIllegalStateExceptionথ্রো হবে। এটি তখন ব্যবহৃত হয় যখন আপনি চান যে কোনো ট্রানজেকশন চলমান থাকলে সেই মেথডটি এক্সিকিউট না হয়।
Example:
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
public class SecurityService {
@TransactionAttribute(TransactionAttributeType.NEVER)
public void performSecurityCheck() {
// This method should never run in a transaction
}
}
এখানে, performSecurityCheck মেথডটি যদি একটি ট্রানজেকশন চলমান থাকে, তবে IllegalStateException ফেলে দিবে।
4. Conclusion
@TransactionAttribute অ্যানোটেশনটি EJB মেথডের ট্রানজেকশন আচরণ কনফিগার করতে ব্যবহৃত হয় এবং এটি পাঁচটি মূল ধরন (REQUIRED, REQUIRES_NEW, SUPPORTS, NOT_SUPPORTED, NEVER) প্রদান করে। এর মাধ্যমে আপনি বিভিন্ন ট্রানজেকশন পরিচালনার কৌশল নির্বাচন করতে পারেন, যা আপনার অ্যাপ্লিকেশন এর ট্রানজেকশন পলিসি অনুযায়ী কার্যকরী হবে।
- REQUIRED: যদি কোনো ট্রানজেকশন না থাকে, তবে নতুন ট্রানজেকশন শুরু হয়।
- REQUIRES_NEW: প্রতিটি মেথডের জন্য নতুন ট্রানজেকশন তৈরি হয়।
- SUPPORTS: যদি কোনো ট্রানজেকশন না থাকে, তাহলে কোনো ট্রানজেকশন ছাড়াই মেথড চলে।
- NOT_SUPPORTED: ট্রানজেকশন সাসপেন্ড হয়ে মেথডটি ট্রানজেকশন ছাড়াই চলে।
- NEVER: কোনো ট্রানজেকশন চলমান থাকলে ত্রুটি (exception) ঘটাবে।
এই অ্যানোটেশনগুলি EJB ট্রানজেকশন ম্যানেজমেন্টের জন্য অত্যন্ত গুরুত্বপূর্ণ এবং এটি ডেভেলপারকে তাদের ট্রানজেকশন কাঠামো কাস্টমাইজ করার শক্তিশালী সুযোগ প্রদান করে।
Read more