iBATIS এ Transaction Handling

Transactions এবং iBATIS - আইবাটিস (iBATIS) - Java Technologies

409

iBATIS (বর্তমানে MyBatis) একটি শক্তিশালী ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা SQL কুয়েরির মাধ্যমে ডেটাবেস অপারেশন পরিচালনা করে। Transaction Management হল একটি গুরুত্বপূর্ণ বিষয়, যা ডেটাবেস অপারেশনের অ্যাটমিকতা (Atomicity), ধারাবাহিকতা (Consistency), এবং নিরাপত্তা (Integrity) নিশ্চিত করতে ব্যবহৃত হয়। iBATIS-এ ট্রানজেকশন পরিচালনা করার জন্য আপনাকে TransactionManager এবং SqlSession ব্যবহার করতে হবে।

iBATIS (MyBatis) ডাটাবেস ট্রানজেকশন পরিচালনার জন্য দুটি প্রধান পদ্ধতি সরবরাহ করে:

  1. Programmatic Transaction Management
  2. Declarative Transaction Management (Spring Integration)

এখানে আমরা Programmatic Transaction Management নিয়ে আলোচনা করব, যা iBATIS-এর সাথে কাজ করতে সহজ এবং সুসংগত।


1. Programmatic Transaction Management in iBATIS

Programmatic Transaction Management-এ আপনি নিজেই ট্রানজেকশন শুরু, কমিট, বা রোলব্যাক করতে পারেন। iBATIS এর SqlSession এবং TransactionManager ব্যবহার করে আপনি এই কাজগুলো করতে পারবেন।

Step 1: iBATIS Configuration (sql-map-config.xml)

প্রথমে, আপনার sql-map-config.xml কনফিগারেশন ফাইল তৈরি করতে হবে যাতে ট্রানজেকশন ম্যানেজার এবং ডেটাবেস সংযোগ কনফিগার করা হয়।

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS//DTD SQL Map Config 3.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-3.dtd">
<sqlMapConfig>
    <!-- DataSource Configuration -->
    <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>

    <!-- Transaction Manager Configuration -->
    <transactionManager type="JDBC"/>

    <!-- Mapper Files -->
    <sqlMap resource="com/example/mapper/EmployeeMapper.xml"/>
</sqlMapConfig>

এখানে:

  • DataSource: ডেটাবেস সংযোগ কনফিগারেশন।
  • TransactionManager: JDBC ভিত্তিক ট্রানজেকশন ম্যানেজার কনফিগার করা হয়েছে।

2. iBATIS Transaction Handling in Java Code

iBATIS-এ ট্রানজেকশন হ্যান্ডলিং করতে SqlSession ব্যবহার করা হয়, যা commit এবং rollback অপারেশন পরিচালনা করতে সাহায্য করে।

Example: Programmatic Transaction Management in Java

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.apache.ibatis.datasource.pooled.PooledDataSource;

public class EmployeeApp {
    
    public static void main(String[] args) {
        
        // Step 1: Set up SqlSessionFactory from configuration file
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
                .build(EmployeeApp.class.getResourceAsStream("/sql-map-config.xml"));
        
        // Step 2: Open SqlSession
        SqlSession session = sessionFactory.openSession();
        Transaction transaction = session.getTransaction();

        try {
            // Step 3: Perform Database Operations
            EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
            Employee newEmployee = new Employee();
            newEmployee.setName("John Doe");
            newEmployee.setDepartment("IT");

            mapper.insertEmployee(newEmployee);  // Insert new employee

            // Step 4: Commit Transaction
            session.commit();  // Commit if no error

            System.out.println("Employee inserted successfully");

        } catch (Exception e) {
            // Step 5: Rollback Transaction if error occurs
            session.rollback();
            e.printStackTrace();
        } finally {
            // Step 6: Close session
            session.close();
        }
    }
}

Explanation:

  1. sessionFactory.openSession(): একটি SqlSession খোলা হয়, যা ডেটাবেসের সাথে যোগাযোগ করে এবং ট্রানজেকশন ম্যানেজমেন্টের জন্য ব্যবহৃত হয়।
  2. session.getTransaction(): এটি SqlSession থেকে ট্রানজেকশন অবজেক্ট পায় যা ট্রানজেকশন পরিচালনা করতে সাহায্য করে।
  3. mapper.insertEmployee(newEmployee): এটি EmployeeMapper মেপারের insertEmployee মেথড কল করে নতুন কর্মচারী ডাটাবেসে ইনসার্ট করে।
  4. session.commit(): যদি কোন ত্রুটি না ঘটে, তবে commit() মেথড ব্যবহার করে ট্রানজেকশন সফলভাবে ডাটাবেসে স্থায়ী করা হয়।
  5. session.rollback(): যদি কোনো ত্রুটি ঘটে, তবে পরিবর্তনগুলি বাতিল করতে rollback() মেথড ব্যবহার করা হয়।
  6. session.close(): ট্রানজেকশন শেষে SqlSession বন্ধ করা হয়।

3. Spring Integration for Declarative Transaction Management

যদি আপনি Spring Framework ব্যবহার করেন, তবে Spring এর declarative transaction management ব্যবহার করে iBATIS-এ ট্রানজেকশন পরিচালনা করা সম্ভব। Spring-এ @Transactional অ্যানোটেশন ব্যবহার করে আপনাকে ট্রানজেকশন ম্যানেজমেন্ট সহজভাবে করতে পারে।

Step 1: Add Spring Transaction Manager in applicationContext.xml

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
    <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="transactionManager" class="org.mybatis.spring.SqlSessionTransactionManager">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

Step 2: @Transactional Usage in Service Layer

import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Transactional
    public void saveEmployee(Employee employee) {
        employeeMapper.insertEmployee(employee);
        // If any exception occurs, transaction will be rolled back
    }
}

Explanation:

  • @Transactional: এটি Spring-এর Declarative Transaction Management এর অংশ, যা স্বয়ংক্রিয়ভাবে ট্রানজেকশন পরিচালনা করে। @Transactional অ্যানোটেশন ব্যবহার করলে, যদি কোনো মেথডের মধ্যে কোনো ত্রুটি হয়, তাহলে Spring স্বয়ংক্রিয়ভাবে rollback করবে এবং সমস্ত পরিবর্তন রিভার্ট করবে।
  • @Transactional ব্যবহার করলে আপনাকে commit() এবং rollback() ম্যানুয়ালি করতে হবে না। Spring এক্সেপশন হলে রোলব্যাক এবং সফল হলে কমিট পরিচালনা করবে।

4. Best Practices for Transaction Management in iBATIS (MyBatis)

  1. Use Transactions for All CRUD Operations:
    • সব Create, Read, Update, এবং Delete (CRUD) অপারেশনে ট্রানজেকশন ব্যবহার করুন, এটি ডেটাবেসের অ্যাটমিকতা এবং ডেটার ধারাবাহিকতা নিশ্চিত করবে।
  2. Handle Rollback Properly:
    • যদি কোনো অপারেশন ব্যর্থ হয়, তাহলে ডেটাবেসে করা পরিবর্তনগুলো রোলব্যাক করা উচিত। এক্ষেত্রে rollback() মেথড ব্যবহার করুন।
  3. Keep Transactions Short:
    • ট্রানজেকশন যতটা সম্ভব ছোট রাখুন, কারণ বড় ট্রানজেকশন ডেটাবেসে লক সৃষ্টি করতে পারে এবং পারফরম্যান্সে নেতিবাচক প্রভাব ফেলতে পারে।
  4. Use @Transactional for Declarative Management (Spring):
    • যদি আপনি Spring ব্যবহার করেন, তবে @Transactional অ্যানোটেশন ব্যবহার করুন। এটি কোডকে পরিষ্কার এবং সহজ করে তোলে এবং Spring স্বয়ংক্রিয়ভাবে ট্রানজেকশন ম্যানেজমেন্ট করবে।
  5. Avoid Nested Transactions:
    • নেস্টেড ট্রানজেকশন এড়ানো উচিত, কারণ এগুলি জটিল এবং পারফরম্যান্সে নেতিবাচক প্রভাব ফেলতে পারে। সব অপারেশন একটি ট্রানজেকশনে থাকতে ভাল।

iBATIS (MyBatis)-এ Transaction Management অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ডেটাবেসের অ্যাটমিক এবং সুরক্ষিত অপারেশন নিশ্চিত করে। Programmatic এবং Declarative ট্রানজেকশন ম্যানেজমেন্টের মাধ্যমে, আপনি আপনার ডেটাবেস অপারেশনগুলোকে আরও নিরাপদ, কার্যকরী এবং কার্যকরভাবে পরিচালনা করতে পারেন। Spring ব্যবহারের ক্ষেত্রে, @Transactional অ্যানোটেশন ব্যবহার করে ডেক্লারেটিভ ট্রানজেকশন ম্যানেজমেন্ট খুবই সহজ এবং নিরাপদ।

Content added By
Promotion

Are you sure to start over?

Loading...