JPA (Java Persistence API) ডেটাবেসের সাথে অবজেক্ট-রিলেশনাল ম্যাপিং (ORM) সরবরাহ করে এবং ডেটা প্রসেসিংয়ের জন্য বিভিন্ন লকিং মেকানিজম সমর্থন করে, যার মাধ্যমে ডেটার একাধিক প্রক্রিয়া বা থ্রেড দ্বারা একসাথে পরিবর্তন হওয়া থেকে রক্ষা করা যায়। এই লকিং মেকানিজম দুটি গুরুত্বপূর্ণ ধারণা হলো: Optimistic Locking এবং Pessimistic Locking। এই দুটি পদ্ধতি ডেটা কনকর্শনের (data concurrency) সমস্যাগুলির মোকাবিলা করতে সাহায্য করে।
Optimistic Locking (অপটিমিস্টিক লকিং)
Optimistic Locking এমন একটি কৌশল যা তখন ব্যবহৃত হয় যখন এটি মনে করা হয় যে একাধিক থ্রেড বা প্রক্রিয়া একই সময়ে ডেটা আপডেট করবে না। অপটিমিস্টিক লকিং সাধারণত লকিং প্রক্রিয়া ছাড়া কাজ করে এবং এটি ধারণা করে যে কনফ্লিক্ট (conflict) খুব কম হবে। এটি শুধুমাত্র তখন কার্যকর হয় যখন দুটি বা তার বেশি থ্রেড বা প্রক্রিয়া একই রেকর্ডে একযোগে পরিবর্তন করার চেষ্টা করে।
Optimistic Locking মূলত versioning পদ্ধতি ব্যবহার করে। যখন কোনো ডেটা আপডেট করা হয়, তখন একটি ভার্সন নম্বর (version number) পরীক্ষা করা হয়। যদি দুটি থ্রেড একই ডেটা আপডেট করার চেষ্টা করে এবং তাদের মধ্যে ভার্সন নম্বরের তারতম্য থাকে, তবে একটি OptimisticLockException তৈরি হয়, যা জানায় যে একজন ইউজার ইতিমধ্যে সেই রেকর্ডটি আপডেট করেছে।
Optimistic Locking উদাহরণ:
Entity ক্লাসে @Version অ্যানোটেশন ব্যবহার করা হয়:
import javax.persistence.*;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
@Version
private int version; // Version field for Optimistic Locking
// Getters and Setters
}
এখানে, @Version অ্যানোটেশনটি version ফিল্ডটিকে ডেটার ভার্সন হিসাবে চিহ্নিত করে, যা প্রতিটি আপডেটের জন্য বৃদ্ধি পায়।
ProductService ক্লাসে আপডেট লজিক:
public void updateProduct(Long id, double newPrice) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Product product = em.find(Product.class, id);
product.setPrice(newPrice);
em.getTransaction().commit();
em.close();
}
এখানে, যদি দুইজন ইউজার একসাথে একই Product রেকর্ডটি আপডেট করার চেষ্টা করেন, তবে OptimisticLockException ঘটবে যদি ভার্সন নম্বর মেলেনা।
Pessimistic Locking (পেসিমিস্টিক লকিং)
Pessimistic Locking এমন একটি কৌশল যা ডেটা পরিবর্তনের সময়ে লক ব্যবহৃত করে, যাতে অন্য থ্রেড বা প্রক্রিয়া সেই ডেটা পরিবর্তন করতে না পারে। এই পদ্ধতিতে, যখন একটি ডেটার উপর অপারেশন করা হয়, তখন সেই ডেটা এক্সক্লুসিভ লক করা হয়, যাতে অন্য কোনো থ্রেড বা প্রক্রিয়া ঐ ডেটা আপডেট বা রিড করতে না পারে যতক্ষণ না প্রথম থ্রেড বা প্রক্রিয়া অপারেশনটি সম্পন্ন করে।
Pessimistic Locking বেশিরভাগ সময় database level locking এর মাধ্যমে কাজ করে এবং এটি ডেটাবেসের উপর লক প্রয়োগ করে, যাতে অন্য থ্রেডগুলি সেই রেকর্ডটি অ্যাক্সেস করতে না পারে। এটি সাধারনত PESSIMISTIC_READ, PESSIMISTIC_WRITE, অথবা FORCE অপশনগুলো ব্যবহার করে।
Pessimistic Locking উদাহরণ:
EntityManager-এ PESSIMISTIC_WRITE লকিং:
public void updateProductPrice(Long id, double newPrice) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// Applying Pessimistic Write Lock
Product product = em.find(Product.class, id, LockModeType.PESSIMISTIC_WRITE);
product.setPrice(newPrice);
em.getTransaction().commit();
em.close();
}
এখানে, LockModeType.PESSIMISTIC_WRITE এর মাধ্যমে Product রেকর্ডটি লক করা হয় এবং অন্য কোনো থ্রেড সেই রেকর্ডটি পরিবর্তন করতে পারবে না যতক্ষণ না লক মুক্ত হয়। এই পদ্ধতি লকিং নিশ্চিত করে, যাতে একাধিক ইউজার একে অপরের কাজের উপর প্রভাব ফেলতে না পারে।
Optimistic Locking এবং Pessimistic Locking এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Optimistic Locking | Pessimistic Locking |
|---|---|---|
| লকিং পদ্ধতি | ডেটা আপডেটের আগে কোনো লক প্রয়োগ করা হয় না, তবে একটি ভার্সন চেক করা হয়। | ডেটা আপডেটের সময় একটি এক্সক্লুসিভ লক প্রয়োগ করা হয়। |
| ব্যবহার | যদি কনফ্লিক্ট খুব কম ঘটে, তখন এটি কার্যকর। | যদি একাধিক প্রক্রিয়া একে অপরের সাথে একযোগে কাজ করে, তবে এটি কার্যকর। |
| কনফ্লিক্ট হ্যান্ডলিং | OptimisticLockException তৈরি হয় যখন ভার্সন মিলছে না। | ডেটা লক থাকলে অন্যান্য প্রক্রিয়াগুলি অপেক্ষা করে। |
| পারফরম্যান্স | উচ্চ পারফরম্যান্স, কারণ কোন লকিং ব্যবস্থাপনা হয় না। | কম পারফরম্যান্স, কারণ এটি লকিং ব্যবস্থাপনা করে। |
| মোট পরিমাণ কাজ | কমপ্লেক্স কনফ্লিক্ট হ্যান্ডলিং (তবে কম লকিং)। | উচ্চ লকিং ও অপেক্ষা (তবে সোজা কনফ্লিক্ট হ্যান্ডলিং)। |
সারাংশ
Optimistic Locking এবং Pessimistic Locking দুটি পৃথক পদ্ধতি যা ডেটাবেস কনকারেন্সি এবং ডেটা কনফ্লিক্ট ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। Optimistic Locking কম কনফ্লিক্ট বা ছোট প্রকল্পগুলির জন্য উপযুক্ত যেখানে লকিং পদ্ধতির প্রয়োজন হয় না এবং Pessimistic Locking সেই সিস্টেমগুলির জন্য উপযুক্ত যেখানে উচ্চ কনফ্লিক্ট এবং ডেটা নিরাপত্তা প্রয়োজন, এবং সেই কারণে লকিং ব্যবস্থাপনা ব্যবহৃত হয়।
Read more