উদাহরণ সহ Locking Implementation

Spring ORM এ Optimistic এবং Pessimistic Locking - স্প্রিং ওআরএম (Spring ORM) - Java Technologies

348

Spring ORM এ Locking ব্যবহার করা হয় কনকারেন্সি কন্ট্রোলের জন্য, যাতে একই ডেটার উপর একাধিক ট্রানজ্যাকশন সঠিকভাবে পরিচালনা করা যায়। Hibernate বা JPA-তে Locking মেকানিজম ডেটাবেস লেভেলে ডেটার কনসিস্টেন্সি নিশ্চিত করে।

Hibernate দুটি ধরনের লকিং সরবরাহ করে:

  • Optimistic Locking
  • Pessimistic Locking

Optimistic Locking

Optimistic Locking তখন ব্যবহৃত হয় যখন ডেটার সংঘর্ষ (conflict) খুব কম হয়। এটি ডেটা আপডেট করার আগে একটি ভার্সন চেক করে সংঘর্ষ প্রতিরোধ করে।

কনফিগারেশন: Optimistic Locking

Entity-তে @Version ব্যবহার
import jakarta.persistence.*;

@Entity
@Table(name = "products")
public class Product {

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

    @Column(name = "name")
    private String name;

    @Column(name = "price")
    private Double price;

    @Version
    private Integer version; // Version field for Optimistic Locking

    // Getters and Setters
}

ব্যাখ্যা:

  • @Version অ্যানোটেশনটি Hibernate বা JPA-কে বলে দেয়, ট্রানজ্যাকশন চলাকালে ডেটার একটি ভার্সন ট্যাক করুন।
  • যখন অন্য কেউ একই ডেটা পরিবর্তন করার চেষ্টা করে এবং ভার্সন মেলে না, তখন OptimisticLockException থ্রো করা হয়।

উদাহরণ: Optimistic Locking

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

import javax.transaction.Transactional;

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    @Transactional
    public Product updateProductPrice(Long id, Double newPrice) {
        Product product = productRepository.findById(id).orElseThrow(() -> new RuntimeException("Product not found"));
        product.setPrice(newPrice);
        return productRepository.save(product);
    }
}

Exception Handling:

try {
    productService.updateProductPrice(1L, 200.0);
} catch (OptimisticLockException e) {
    System.out.println("Conflict detected: " + e.getMessage());
}

Pessimistic Locking

Pessimistic Locking তখন ব্যবহৃত হয় যখন ডেটার সংঘর্ষের সম্ভাবনা বেশি থাকে। এটি ডেটাবেস লেভেলে লক তৈরি করে, যাতে অন্য ট্রানজ্যাকশন সেই ডেটা অ্যাক্সেস করতে না পারে যতক্ষণ না বর্তমান ট্রানজ্যাকশন সম্পূর্ণ হয়।

কনফিগারেশন: Pessimistic Locking

JPA Locking API ব্যবহার
import jakarta.persistence.*;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public class ProductRepository {

    @PersistenceContext
    private EntityManager entityManager;

    public Optional<Product> findProductWithPessimisticLock(Long id) {
        return Optional.ofNullable(entityManager.find(Product.class, id, LockModeType.PESSIMISTIC_WRITE));
    }
}

LockModeType Options:

  • PESSIMISTIC_READ: ডেটা পড়ার জন্য লক।
  • PESSIMISTIC_WRITE: ডেটা আপডেট বা ডিলিটের জন্য লক।
  • PESSIMISTIC_FORCE_INCREMENT: লক সহ ভার্সন আপডেট।

উদাহরণ: Pessimistic Locking

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

import javax.transaction.Transactional;

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    @Transactional
    public void updateProductWithLock(Long id, Double newPrice) {
        Product product = productRepository.findProductWithPessimisticLock(id)
                            .orElseThrow(() -> new RuntimeException("Product not found"));
        product.setPrice(newPrice);
    }
}

Optimistic vs Pessimistic Locking

বৈশিষ্ট্যOptimistic LockingPessimistic Locking
ব্যবহার ক্ষেত্রসংঘর্ষের সম্ভাবনা কম।সংঘর্ষের সম্ভাবনা বেশি।
পারফরম্যান্সলকিংয়ের জন্য অতিরিক্ত ওভারহেড নেই।ডেটাবেস লকিং ওভারহেড বেশি।
কনফ্লিক্ট হ্যান্ডলিংডেটা সংঘর্ষ হলে Exception থ্রো করে।ডেটা সংঘর্ষ হওয়ার আগে লক করে প্রতিরোধ করে।

Hibernate-এ Locking কৌশল ব্যবহার করে ডেটার কনসিস্টেন্সি এবং সঠিকতা নিশ্চিত করা যায়। Optimistic Locking পারফরম্যান্সে উন্নত হলেও, Pessimistic Locking ডেটা নিরাপত্তা নিশ্চিত করে। সঠিক ব্যবহারের জন্য অ্যাপ্লিকেশন কনটেক্সট অনুযায়ী Locking কৌশল বেছে নিতে হবে।

Content added By
Promotion

Are you sure to start over?

Loading...