উদাহরণ সহ Transaction Management

Java Technologies - স্প্রিং বুট জেপিএ (Spring Boot JPA) - Transaction Management
294

Transaction Management কি?

Transaction Management হল একটি প্রক্রিয়া যার মাধ্যমে ডাটাবেসে একাধিক অপারেশনকে একটি একক ইউনিট হিসেবে সম্পাদন করা হয়। একটি ট্রানজেকশন সম্পূর্ণ হওয়া পর্যন্ত বা ব্যর্থ হলে সমস্ত অপারেশন রোলব্যাক করা হয়। Spring Framework-এ Transaction Management একটি গুরুত্বপূর্ণ ফিচার, যা ডাটাবেস বা অন্য কোনো রিসোর্সে একাধিক অপারেশনের কার্যকারিতা নিশ্চিত করে।

Spring Boot-এ JPA Transaction Management ডাটাবেসের সাথে কাজ করার সময় ডেটা এক্সেস লেয়ারে সঠিকভাবে টপিক্যাল ট্রানজেকশন পরিচালনা করতে সাহায্য করে। Spring-এ ট্রানজেকশন ম্যানেজমেন্ট সাধারনত @Transactional অ্যানোটেশন ব্যবহার করে করা হয়।


Spring Boot JPA তে Transaction Management

Spring Boot JPA ব্যবহার করে ট্রানজেকশন ম্যানেজমেন্টে আপনাকে মূলত নিম্নলিখিত তিনটি কাজ করতে হবে:

  1. @Transactional অ্যানোটেশন ব্যবহার করা: এই অ্যানোটেশনটি ট্রানজেকশন চালানোর জন্য ব্যবহৃত হয়। এটি নিশ্চিত করে যে, একটি মেথডের মধ্যে সমস্ত অপারেশনগুলো একসাথে সফলভাবে শেষ হবে বা কোনো এক অপারেশন ব্যর্থ হলে সবকিছু রোলব্যাক হবে।
  2. PlatformTransactionManager ব্যবহৃত হয় ট্রানজেকশন পরিচালনার জন্য, তবে Spring Boot স্বয়ংক্রিয়ভাবে এই কনফিগারেশন সেট করে দেয়।
  3. rollbackFor: ট্রানজেকশন রোলব্যাক কন্ডিশন কাস্টমাইজ করার জন্য ব্যবহার করা যায়। এটি নির্দিষ্ট এক্সসেপশনগুলির জন্য রোলব্যাক নির্দেশ করে।

Spring Boot JPA তে Transaction Management উদাহরণ

এখানে একটি উদাহরণ দেখা যাবে যেখানে EmployeeService@Transactional অ্যানোটেশন ব্যবহার করে একাধিক ডাটাবেস অপারেশন একটি একক ট্রানজেকশনে সম্পাদিত হবে।

১. Maven ডিপেনডেন্সি যুক্ত করা

প্রথমে, pom.xml ফাইলে Spring Boot JPA ডিপেনডেন্সি যুক্ত করতে হবে:

<dependencies>
    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- H2 Database for In-memory testing (Use appropriate DB for production) -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Test for Unit Tests -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

২. Application.properties কনফিগারেশন

application.properties ফাইলটি ডাটাবেস কনফিগারেশন সেট করার জন্য ব্যবহার করা হয়:

# JPA & Database Configuration
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

৩. Employee Entity তৈরি করা

Employee.java

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String department;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }
}

৪. EmployeeRepository তৈরি করা

EmployeeRepository.java

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    Employee findByName(String name);
}

৫. EmployeeService তৈরি করা (Transactional ব্যবহার)

এখানে, EmployeeService ক্লাসে @Transactional অ্যানোটেশন ব্যবহার করা হচ্ছে। এর মাধ্যমে saveEmployee() মেথডের মধ্যে দুটি অপারেশন সম্পাদিত হবে একটি একক ট্রানজেকশনে।

EmployeeService.java

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 Employee saveEmployee(Employee employee) {
        // Save Employee data
        Employee savedEmployee = employeeRepository.save(employee);

        // Simulate another operation that should be part of the same transaction
        if (savedEmployee.getName().equals("John Doe")) {
            throw new RuntimeException("Simulating an error");
        }

        return savedEmployee;
    }
}

এখানে, saveEmployee() মেথডে প্রথমে একটি Employee অবজেক্ট সেভ করা হচ্ছে। এরপর একটি সিমুলেটেড ত্রুটি (error) সৃষ্টি করা হয়েছে, যা ট্রানজেকশন রোলব্যাক করবে।

৬. EmployeeController তৈরি করা

EmployeeController.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/employees")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    @PostMapping
    public Employee createEmployee(@RequestBody Employee employee) {
        return employeeService.saveEmployee(employee);
    }
}

৭. Spring Boot অ্যাপ্লিকেশন চালানো

Application.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Transaction Management এর কাজ

  1. @Transactional অ্যানোটেশনটি EmployeeService ক্লাসের saveEmployee() মেথডে যুক্ত করা হয়েছে। এর মাধ্যমে দুটি অপারেশন একসাথে ট্রানজেকশনে সম্পন্ন হবে। যদি প্রথম অপারেশন সফল হয় এবং দ্বিতীয় অপারেশনে কোনো ত্রুটি ঘটে, তবে পুরো ট্রানজেকশন রোলব্যাক হবে।
  2. যদি employee.getName().equals("John Doe") শর্তটি মিলে, একটি RuntimeException ঘটানো হবে এবং Spring এই টেস্ট ট্রানজেকশন রোলব্যাক করবে, ফলে কোনো ডেটা ডাটাবেসে সেভ হবে না।

Rollback কাস্টমাইজ করা

Spring-এ @Transactional এর মাধ্যমে আপনি rollbackFor ব্যবহার করে নির্দিষ্ট এক্সসেপশন গুলোর জন্য রোলব্যাক কাস্টমাইজ করতে পারেন।

উদাহরণ:

@Transactional(rollbackFor = {RuntimeException.class})
public void saveEmployeeWithRollback(Employee employee) {
    // Some logic
    if (employee.getName().equals("John Doe")) {
        throw new RuntimeException("Simulating an error");
    }
}

এখানে, শুধুমাত্র RuntimeException বা তার সাবক্লাসগুলির জন্য রোলব্যাক হবে।


সারাংশ

Transaction Management Spring Boot এবং JPA ব্যবহারের মাধ্যমে ডাটাবেসের একাধিক অপারেশনকে একত্রে পরিচালনা করার জন্য গুরুত্বপূর্ণ। @Transactional অ্যানোটেশন ব্যবহার করে আপনি একটি মেথডের মধ্যে একাধিক অপারেশন সম্পাদন করতে পারেন এবং কোনো একটি অপারেশন ব্যর্থ হলে সবকিছু রোলব্যাক করতে পারেন। Spring Boot এবং JPA-তে টপিক্যাল ট্রানজেকশন পরিচালনার মাধ্যমে ডেটার একত্রিততা এবং সিস্টেমের সঠিক কার্যকারিতা নিশ্চিত করা সম্ভব।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...