Spring ORM-এ Optimistic Locking এবং Pessimistic Locking হল কনকারেন্সি কন্ট্রোল মেকানিজম, যা ডাটাবেস অ্যাক্সেস করার সময় ডেটার সঠিকতা নিশ্চিত করে। ডেটা পরিবর্তনের সময় মাল্টিপল ট্রানজ্যাকশনের মধ্যে সংঘর্ষ এড়ানোর জন্য এগুলো ব্যবহৃত হয়।
Optimistic Locking
Optimistic Locking হল এমন একটি পদ্ধতি যেখানে ধরে নেওয়া হয়, একই ডেটা একই সময়ে অন্য কেউ আপডেট করবে না। এটি ডেটা আপডেটের আগে চেক করে, ডেটা পরিবর্তিত হয়েছে কিনা।
কিভাবে কাজ করে:
- ডেটার প্রতিটি রেকর্ডে একটি Version বা Timestamp কলাম থাকে।
- যখন কোনো ট্রানজ্যাকশন ডেটা আপডেট করতে চায়, তখন এটি সেই রেকর্ডের বর্তমান Version যাচাই করে।
- যদি Version পরিবর্তিত না হয়, তবে আপডেট সফল হয়; অন্যথায় একটি কনকারেন্সি সমস্যা বলে গণ্য হয় এবং ব্যর্থ হয়।
বৈশিষ্ট্য:
- Deadlock এড়ায়।
- লক ব্যবহৃত হয় না।
- বেশি পড়া-লেখার অ্যাক্সেস (Read-Write Access) ক্ষেত্রে কার্যকর।
উদাহরণ:
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
@Version
private int version;
// Getters and Setters
}
কার্যপ্রণালী:
versionফিল্ডটি Hibernate দ্বারা স্বয়ংক্রিয়ভাবে পরিচালিত হয়।- ডেটা আপডেটের সময় Hibernate বর্তমান
versionযাচাই করে। - যদি
versionমিলে না যায়, তখন OptimisticLockException নিক্ষেপ করা হয়।
Pessimistic Locking
Pessimistic Locking এমন একটি পদ্ধতি যেখানে ধরে নেওয়া হয়, একই ডেটা অন্য কেউ একসাথে আপডেট করতে পারে। এটি প্রতিরোধ করার জন্য, ডেটা পড়ার বা লেখার সময় লক প্রয়োগ করা হয়।
কিভাবে কাজ করে:
- একটি রেকর্ড অ্যাক্সেস করার সময় Hibernate ডাটাবেসে লক সেট করে।
- অন্য কোনো ট্রানজ্যাকশন সেই রেকর্ড অ্যাক্সেস করতে পারবে না যতক্ষণ লক রিলিজ না হয়।
বৈশিষ্ট্য:
- Deadlock এর সম্ভাবনা থাকে।
- বেশি লেখার অ্যাক্সেস (Write Access) ক্ষেত্রে কার্যকর।
- অন্যান্য ট্রানজ্যাকশনকে ব্লক করে রাখে।
উদাহরণ:
public Product findWithPessimisticLock(Long id) {
return entityManager.find(Product.class, id, LockModeType.PESSIMISTIC_WRITE);
}
LockModeType এর ধরন:
PESSIMISTIC_READ: রিড অপারেশন লক করে, তবে ডেটা পরিবর্তন করতে দেয় না।PESSIMISTIC_WRITE: রাইট অপারেশন লক করে, অন্য ট্রানজ্যাকশনকে সম্পূর্ণ ব্লক করে।PESSIMISTIC_FORCE_INCREMENT: রাইটের সাথে সাথেversionইনক্রিমেন্ট করে।
Optimistic এবং Pessimistic Locking এর পার্থক্য
| প্যারামিটার | Optimistic Locking | Pessimistic Locking |
|---|---|---|
| লকিং কৌশল | লক প্রয়োগ করা হয় না। | লক প্রয়োগ করা হয়। |
| কনফ্লিক্ট সমাধান | Version বা Timestamp দিয়ে সংঘর্ষ নির্ধারণ। | ট্রানজ্যাকশন লক দিয়ে সংঘর্ষ প্রতিরোধ। |
| Deadlock এর ঝুঁকি | Deadlock এর কোনো ঝুঁকি নেই। | Deadlock এর ঝুঁকি রয়েছে। |
| পারফরম্যান্স | বেশি পড়া-লেখা কার্যক্রমে ভালো পারফরম্যান্স। | বেশি লেখার কার্যক্রমে কার্যকর। |
| ব্যবহারিক ক্ষেত্র | কম কনকারেন্ট রাইট অপারেশনের জন্য উপযুক্ত। | বেশি কনকারেন্ট রাইট অপারেশনের জন্য উপযুক্ত। |
| ব্যবহার | @Version ব্যবহার করে সহজে কনফিগার করা যায়। | LockModeType ব্যবহার করে কনফিগার করতে হয়। |
ব্যবহারিক উদাহরণ
Optimistic Locking ব্যর্থতার হ্যান্ডলিং:
try {
product.setPrice(500.0);
productRepository.save(product);
} catch (OptimisticLockException e) {
System.out.println("Concurrency conflict detected!");
}
Pessimistic Locking উদাহরণ:
@Transactional
public Product updateProduct(Long id, double newPrice) {
Product product = entityManager.find(Product.class, id, LockModeType.PESSIMISTIC_WRITE);
product.setPrice(newPrice);
return product;
}
কবে কোনটি ব্যবহার করবেন?
- Optimistic Locking:
- যখন ডেটা পরিবর্তনের সম্ভাবনা কম।
- বড় অ্যাপ্লিকেশন যেখানে বেশি পড়া (Read-Heavy) কাজ হয়।
- Deadlock প্রতিরোধ করতে।
- Pessimistic Locking:
- যখন ডেটা পরিবর্তনের সম্ভাবনা বেশি।
- ছোট অ্যাপ্লিকেশন যেখানে বেশি লেখা (Write-Heavy) কাজ হয়।
- ডেটা সঠিকতা অত্যন্ত গুরুত্বপূর্ণ হলে।
Spring ORM এ Locking মেকানিজম সঠিকভাবে ব্যবহার করলে ডেটা ইন্টেগ্রিটি নিশ্চিত করা যায় এবং অ্যাপ্লিকেশনের কনকারেন্সি সমস্যা এড়ানো সম্ভব হয়।
Read more