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 Locking | Pessimistic Locking |
|---|---|---|
| ব্যবহার ক্ষেত্র | সংঘর্ষের সম্ভাবনা কম। | সংঘর্ষের সম্ভাবনা বেশি। |
| পারফরম্যান্স | লকিংয়ের জন্য অতিরিক্ত ওভারহেড নেই। | ডেটাবেস লকিং ওভারহেড বেশি। |
| কনফ্লিক্ট হ্যান্ডলিং | ডেটা সংঘর্ষ হলে Exception থ্রো করে। | ডেটা সংঘর্ষ হওয়ার আগে লক করে প্রতিরোধ করে। |
Hibernate-এ Locking কৌশল ব্যবহার করে ডেটার কনসিস্টেন্সি এবং সঠিকতা নিশ্চিত করা যায়। Optimistic Locking পারফরম্যান্সে উন্নত হলেও, Pessimistic Locking ডেটা নিরাপত্তা নিশ্চিত করে। সঠিক ব্যবহারের জন্য অ্যাপ্লিকেশন কনটেক্সট অনুযায়ী Locking কৌশল বেছে নিতে হবে।
Read more