iBATIS (বর্তমানে MyBatis নামে পরিচিত) একটি Java ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা SQL স্টেটমেন্টের মাধ্যমে ডেটাবেস অ্যাক্সেস এবং ম্যানিপুলেশন করে। iBATIS (MyBatis) ডেটাবেসের সাথে কাজ করার সময় Transaction Management অত্যন্ত গুরুত্বপূর্ণ একটি বিষয়, কারণ ট্রানজেকশনের মাধ্যমে ডেটাবেসের অপারেশনগুলি একত্রিত করা যায়, যা atomicity নিশ্চিত করে। এর মাধ্যমে আপনি ডেটাবেসে একাধিক অপারেশন সম্পাদন করতে পারেন এবং সমস্ত অপারেশন সফল হলে তারা একসাথে কমিট হবে, অন্যথায় সমস্ত অপারেশন রোলব্যাক হবে।
Transaction Management MyBatis (iBATIS) এর মধ্যে JDBC transactions এবং MyBatis managed transactions হিসাবে ব্যবহৃত হতে পারে। এখানে আলোচনা করা হবে, iBATIS (MyBatis)-এ ট্রানজেকশন ম্যানেজমেন্টের ধারণা, এটি কিভাবে কাজ করে এবং কিভাবে আপনি ট্রানজেকশন ম্যানেজমেন্ট কনফিগার করবেন।
Transaction Management in iBATIS (MyBatis)
iBATIS (MyBatis) তে ট্রানজেকশন ম্যানেজমেন্ট সাধারণত JDBC transaction এবং MyBatis built-in transaction manager এর মাধ্যমে পরিচালিত হয়। MyBatis-এ Transaction Management মূলত তিনটি ধাপে বিভক্ত হয়:
- Manual Transaction Management: JDBC API এর মাধ্যমে ট্রানজেকশন পরিচালনা করা।
- Managed Transaction: MyBatis-এ স্বয়ংক্রিয়ভাবে ট্রানজেকশন পরিচালনা করা।
- Integration with Spring: Spring Framework এর সাহায্যে ট্রানজেকশন ম্যানেজমেন্ট।
1. Manual Transaction Management (JDBC Transactions)
MyBatis তে Manual Transaction Management করতে, আপনি SqlSession ব্যবহার করেন, যা জাভা কোডের মাধ্যমে commit বা rollback পরিচালনা করতে সাহায্য করে।
Manual Transaction Management Example:
package com.example;
import com.example.mapper.EmployeeMapper;
import com.example.model.Employee;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class Main {
public static void main(String[] args) {
// MyBatis configuration and session factory setup
String resource = "mybatis-config.xml";
InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// Open session
SqlSession session = sqlSessionFactory.openSession();
try {
// Obtain the mapper
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
// Create a new employee
Employee newEmployee = new Employee("John Doe", "Developer", 60000);
// Start a transaction
session.beginTransaction(); // Manually begin transaction
// Perform the insert operation
employeeMapper.insertEmployee(newEmployee);
// Commit the transaction
session.commit(); // Commit the transaction
} catch (Exception e) {
// If an error occurs, rollback the transaction
session.rollback(); // Rollback the transaction
e.printStackTrace();
} finally {
// Close session
session.close();
}
}
}
Explanation:
- beginTransaction(): ট্রানজেকশন শুরু করার জন্য
session.beginTransaction()ব্যবহার করা হয়েছে। - commit(): সফলভাবে ট্রানজেকশন সম্পন্ন হলে
session.commit()দিয়ে ট্রানজেকশন কমিট করা হয়েছে। - rollback(): যদি কোনো ত্রুটি ঘটে, তবে
session.rollback()দিয়ে সমস্ত পরিবর্তন রোলব্যাক করা হয়েছে।
এটি একটি খুব সোজা উদাহরণ যেখানে আপনি ম্যানুয়ালি ট্রানজেকশন শুরু এবং শেষ করতে পারেন।
2. Managed Transaction in MyBatis
MyBatis এ Managed Transaction এর মাধ্যমে, MyBatis নিজেই ট্রানজেকশন পরিচালনা করে, এবং আপনি SqlSessionFactory ব্যবহার করে এটি চালাতে পারেন। এটি সহজ এবং অধিক সুবিধাজনক যখন আপনি JDBC Connection সরাসরি পরিচালনা করতে না চান এবং MyBatis দ্বারা স্বয়ংক্রিয়ভাবে ট্রানজেকশন পরিচালিত হয়।
Managed Transaction Example:
<!-- mybatis-config.xml -->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
Explanation:
- transactionManager: এখানে JDBC transaction ব্যবহৃত হয়েছে, যা MyBatis এর মাধ্যমে স্বয়ংক্রিয়ভাবে ট্রানজেকশন পরিচালনা করবে।
- DataSource: POOLED ডেটাসোর্স কনফিগার করা হয়েছে এবং JDBC টাইপের ট্রানজেকশন ব্যবহৃত হচ্ছে।
এখন আপনি যখন SqlSession তৈরি করবেন, তখন এটি স্বয়ংক্রিয়ভাবে ট্রানজেকশন পরিচালনা করবে।
3. Transaction Management with Spring Integration
যদি আপনি Spring Framework ব্যবহার করেন, তবে Spring এর declarative transaction management ব্যবহার করে MyBatis এর সাথে সহজে ট্রানজেকশন ম্যানেজমেন্ট করতে পারেন। Spring MyBatis-কে JDBC transaction ম্যানেজমেন্ট পদ্ধতির মাধ্যমে স্বয়ংক্রিয়ভাবে পরিচালনা করতে সক্ষম।
Spring with MyBatis Transaction Management Example:
pom.xml (Spring Data and MyBatis Integration Dependencies)
<dependencies>
<!-- Spring Dependency -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!-- MyBatis Spring Integration -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- Spring JDBC Support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
</dependencies>
Spring Configuration (applicationContext.xml)
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="employeeMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
Service Layer Example with @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 EmployeeMapper employeeMapper;
@Transactional
public void addEmployee(Employee employee) {
employeeMapper.insertEmployee(employee);
// Other database operations
}
}
Explanation:
- Spring’s @Transactional Annotation: @Transactional অ্যানোটেশন ব্যবহার করে ট্রানজেকশন ম্যানেজমেন্ট সহজতর করা যায়। যখন
addEmployeeমেথডটি কল করা হবে, তখন Spring স্বয়ংক্রিয়ভাবে ট্রানজেকশন শুরু করবে এবং সফল হলে তা কমিট করবে। - Spring’s DataSourceTransactionManager: Spring
DataSourceTransactionManagerব্যবহার করে MyBatis এর সাথে সংযুক্ত ট্রানজেকশন ম্যানেজমেন্ট পরিচালিত হয়।
iBATIS (MyBatis) তে Transaction Management তিনটি প্রধান পদ্ধতিতে কাজ করে:
- Manual Transaction Management: JDBC এ সরাসরি beginTransaction(), commit(), এবং rollback() ব্যবহার করে ট্রানজেকশন ম্যানেজ করা হয়।
- Managed Transaction: MyBatis স্বয়ংক্রিয়ভাবে JDBC transaction পরিচালনা করে।
- Spring Integration: Spring’s declarative transaction management ব্যবহার করে MyBatis এর সাথে সহজে ট্রানজেকশন ম্যানেজমেন্ট করা যায়।
এটি একটি গুরুত্বপূর্ণ বিষয়, কারণ ট্রানজেকশন ম্যানেজমেন্ট ডেটাবেসের ডেটা সঠিকভাবে এবং একত্রে সঞ্চালিত হওয়া নিশ্চিত করে, এবং অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্থিরতা বৃদ্ধি করে।
Read more