স্প্রিং জেডিবিসি (Spring JDBC) ডাটাবেস ট্রানজেকশন পরিচালনার জন্য একটি শক্তিশালী এবং নমনীয় ট্রানজেকশন ম্যানেজমেন্ট সাপোর্ট সরবরাহ করে। এটি ডাটাবেসের অপারেশনগুলোর ধারাবাহিকতা এবং সঠিকতা নিশ্চিত করে।
কেন ট্রানজেকশন ম্যানেজমেন্ট প্রয়োজন?
একাধিক ডাটাবেস অপারেশনের মধ্যে ধারাবাহিকতা এবং ডাটা ইন্টেগ্রিটি বজায় রাখতে ট্রানজেকশন ব্যবহৃত হয়।
- যদি একাধিক অপারেশনের মধ্যে একটি ব্যর্থ হয়, তাহলে সম্পূর্ণ অপারেশনটি বাতিল (rollback) করে পূর্বের অবস্থায় ফিরে যাওয়া যায়।
- উদাহরণ: ব্যাঙ্কের টাকা ট্রান্সফার সিস্টেম, যেখানে টাকা প্রেরণ এবং প্রাপ্তির উভয় অপারেশন সফল হতে হবে।
Spring Transaction Management Modes:
- Declarative Transaction Management (Annotation Based):
- সহজ এবং জনপ্রিয় পদ্ধতি।
@Transactionalঅ্যানোটেশন ব্যবহার করে ট্রানজেকশন পরিচালনা করা হয়।
- Programmatic Transaction Management:
- কোডের মাধ্যমে ট্রানজেকশন ম্যানেজমেন্ট পরিচালিত হয়।
- কম ব্যবহার করা হয় কারণ এটি বেশি কোডিং প্রয়োজন এবং পরিচালনা জটিল।
উদাহরণ সহ ট্রানজেকশন ম্যানেজমেন্ট
১. Declarative Transaction Management (Annotation Based)
Configuration:
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("user");
dataSource.setPassword("password");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
Service Layer Example:
@Service
public class BankService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional
public void transferMoney(int fromAccountId, int toAccountId, double amount) {
// Deduct money from sender's account
String deductSql = "UPDATE accounts SET balance = balance - ? WHERE id = ?";
jdbcTemplate.update(deductSql, amount, fromAccountId);
// Simulate an error for testing rollback
if (amount > 1000) {
throw new RuntimeException("Transfer amount exceeds limit!");
}
// Add money to receiver's account
String addSql = "UPDATE accounts SET balance = balance + ? WHERE id = ?";
jdbcTemplate.update(addSql, amount, toAccountId);
System.out.println("Money transferred successfully!");
}
}
Controller or Main Method:
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
BankService bankService = context.getBean(BankService.class);
try {
bankService.transferMoney(1, 2, 500); // Successful transfer
bankService.transferMoney(1, 2, 1500); // Will throw exception, rollback
} catch (Exception e) {
System.out.println("Transaction failed: " + e.getMessage());
}
}
২. Programmatic Transaction Management
Service Layer Example:
@Service
public class BankService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private PlatformTransactionManager transactionManager;
public void transferMoney(int fromAccountId, int toAccountId, double amount) {
TransactionDefinition definition = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(definition);
try {
// Deduct money from sender's account
String deductSql = "UPDATE accounts SET balance = balance - ? WHERE id = ?";
jdbcTemplate.update(deductSql, amount, fromAccountId);
// Simulate an error for testing rollback
if (amount > 1000) {
throw new RuntimeException("Transfer amount exceeds limit!");
}
// Add money to receiver's account
String addSql = "UPDATE accounts SET balance = balance + ? WHERE id = ?";
jdbcTemplate.update(addSql, amount, toAccountId);
transactionManager.commit(status);
System.out.println("Money transferred successfully!");
} catch (Exception e) {
transactionManager.rollback(status);
System.out.println("Transaction failed, rolled back: " + e.getMessage());
}
}
}
Key Annotations:
@Transactional:- ক্লাস বা মেথডের উপরে ব্যবহার করা হয়।
- ডিফল্টভাবে সব অপারেশন rollback করা হয় যদি কোনো RuntimeException বা Error ঘটে।
উদাহরণ:
@Transactional public void someMethod() { // transactional code }
- Rollback Specific Exception:
- নির্দিষ্ট এক্সসেপশনের জন্য rollback করতে চাইলে
rollbackForব্যবহার করা যায়। উদাহরণ:
@Transactional(rollbackFor = {SQLException.class}) public void someMethod() { // transactional code }
- নির্দিষ্ট এক্সসেপশনের জন্য rollback করতে চাইলে
ট্রানজেকশন প্রোপাগেশন (Propagation)
Spring এর ট্রানজেকশন ম্যানেজমেন্ট বিভিন্ন প্রোপাগেশন লেভেল সমর্থন করে। কিছু গুরুত্বপূর্ণ প্রোপাগেশন মোড:
- REQUIRED: ডিফল্ট, একই ট্রানজেকশনে চলে।
- REQUIRES_NEW: নতুন ট্রানজেকশন তৈরি করে।
- NESTED: বর্তমান ট্রানজেকশনের ভিতরে একটি সাব-ট্রানজেকশন তৈরি করে।
উদাহরণ:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void anotherMethod() {
// Runs in a new transaction
}
সুবিধা:
- Declarative Support: কম কোড লিখে কার্যকর ট্রানজেকশন পরিচালনা।
- Rollback Support: সহজেই ব্যর্থ অপারেশনগুলো বাতিল করা যায়।
- Flexible Propagation: ট্রানজেকশনের প্রোপাগেশন লেভেল নির্ধারণ করার ক্ষমতা।
সংক্ষেপে:
স্প্রিং জেডিবিসি এর ট্রানজেকশন ম্যানেজমেন্ট ডাটাবেস অপারেশনের ধারাবাহিকতা এবং নির্ভুলতা নিশ্চিত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে। @Transactional ব্যবহার করে সহজেই ট্রানজেকশন পরিচালনা করা যায়, যা প্রোগ্রামিং এর জন্য সুবিধাজনক।
Read more