Transactions এর জন্য Optimistic এবং Pessimistic Locking

JPA এবং Transactions - জেপিএ  (JPA) - Java Technologies

309

JPA (Java Persistence API) তে transactions পরিচালনা করার সময় ডেটাবেসের concurrency control গুরুত্বপূর্ণ ভূমিকা পালন করে। যখন একাধিক ইউজার বা থ্রেড একই ডেটা আপডেট করার চেষ্টা করে, তখন ডেটা inconsistencies বা conflicts হতে পারে। এর জন্য locking mechanisms ব্যবহৃত হয়, যা একে অপরের সাথে সমান্তরালভাবে কাজ করা Entity অবজেক্টগুলির এক্সেস কন্ট্রোল করে। দুটি প্রধান locking পদ্ধতি হল Optimistic Locking এবং Pessimistic Locking

এগুলো নিশ্চিত করে যে একাধিক থ্রেড বা ইউজারদের মধ্যে ডেটার সংঘর্ষ (conflict) এবং অবাঞ্ছিত পরিবর্তন (data corruption) প্রতিরোধ করা হয়।


১. Optimistic Locking

Optimistic Locking হল এমন একটি locking পদ্ধতি যেখানে আমরা ধরি যে ডেটার প্রতি কমপক্ষে একাধিক ইউজারের লেখা হবে না। Optimistic Locking এ, যখন ডেটা আপডেট করার জন্য একটি থ্রেড ডেটাকে ধরে, তখন এটি কোনো lock ধরে না, বরং ডেটা পরিবর্তন করার সময়, version checking বা timestamp checking করা হয়। এটি শুধু তখন conflict চেক করে, যখন ডেটা পরিবর্তন করতে হয়।

Optimistic Locking-এর প্রক্রিয়া:

  1. Versioning: সাধারণত @Version অ্যানোটেশন দিয়ে Entity ক্লাসে একটি version ফিল্ড তৈরি করা হয়।
  2. থ্রেড বা ইউজার যখন ডেটা পরিবর্তন করার চেষ্টা করে, তখন ডেটার version ফিল্ডটি চেক করা হয়।
  3. যদি ডেটার version অন্য থ্রেড দ্বারা পরিবর্তিত হয়ে থাকে, তাহলে conflict detect করা হয় এবং OptimisticLockException ছোঁড়া হয়।

Optimistic Locking উদাহরণ:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Version;

@Entity
public class Product {
    
    @Id
    private Long id;
    private String name;
    private Double price;

    @Version
    private int version;  // Version field for optimistic locking

    // Getters and Setters
}

এখানে:

  • @Version অ্যানোটেশন ব্যবহার করে version ফিল্ডটিকে optimistic locking এর জন্য চিহ্নিত করা হয়েছে।

Optimistic Locking Workflow:

  1. ইউজার প্রথমে Product Entity টির একটি কপি নিয়ে ডেটা পড়ে।
  2. ইউজার ডেটা পরিবর্তন করে এবং EntityManager.merge() বা EntityManager.persist() মেথড ব্যবহার করে ডেটা ডেটাবেসে সেভ করার চেষ্টা করে।
  3. যদি ডেটার version ফিল্ডটি অন্য ইউজারের মাধ্যমে পরিবর্তিত হয়ে থাকে, তবে একটি OptimisticLockException ছোঁড়া হবে।

উপকারিতা:

  • Low contention environments (যেখানে খুব কম মানুষ একই সময়ে ডেটা পরিবর্তন করে) এর জন্য ভালো।
  • ডেটা সিংক্রোনাইজেশনের জন্য কোনো lock প্রয়োজন হয় না, ফলে কার্যকারিতা বৃদ্ধি পায়।

সীমাবদ্ধতা:

  • যদি একাধিক ইউজার একই ডেটা আপডেট করতে চেষ্টা করে, তাহলে OptimisticLockException দেখা যাবে এবং সেই অনুযায়ী ইউজারকে জানানো হয়।

২. Pessimistic Locking

Pessimistic Locking হল এমন একটি locking পদ্ধতি যেখানে একটি থ্রেড বা ইউজার যখন ডেটা আপডেট করার জন্য এক্সেস নেয়, তখন ডেটার ওপর একটি lock স্থাপন করা হয়। এই লকটি অন্য থ্রেড বা ইউজারদের ওই ডেটা আপডেট করতে বাধা দেয় যতক্ষণ না প্রথম ইউজার তাদের কাজ শেষ করে। এটি long-running transactions এ ব্যবহার করা হয় যেখানে ডেটার ওপর একাধিক ইউজারের একসাথে কাজ করার সম্ভাবনা বেশি থাকে।

Pessimistic Locking-এর প্রক্রিয়া:

  1. ডেটা আপডেট করার সময় PESSIMISTIC_WRITE বা PESSIMISTIC_READ লক নেয়া হয়।
  2. কোনো থ্রেড যখন ডেটা lock করে, অন্য থ্রেডটি সেই ডেটার ওপর কোনো পরিবর্তন করতে পারে না যতক্ষণ না প্রথম থ্রেডটি তার ট্রানজেকশন শেষ করে।

Pessimistic Locking উদাহরণ:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.LockModeType;
import javax.persistence.Query;

@Entity
public class Product {
    
    @Id
    private Long id;
    private String name;
    private Double price;

    // Getters and Setters
}
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;

public class ProductService {

    private EntityManager entityManager;

    public void updateProduct(Long productId, Double newPrice) {
        Product product = entityManager.find(Product.class, productId, LockModeType.PESSIMISTIC_WRITE);
        product.setPrice(newPrice);
        entityManager.merge(product);
    }
}

এখানে:

  • LockModeType.PESSIMISTIC_WRITE: এটি ডেটার ওপর একটি write lock নিয়েছে, যা ডেটার পরিবর্তন আটকাবে যতক্ষণ না লকটি রিলিজ হয়।

Pessimistic Locking Workflow:

  1. ইউজার যখন ডেটা আপডেট করতে চায়, তখন PESSIMISTIC_WRITE লক দেওয়া হয়, যা অন্য ইউজারের পরিবর্তন রোধ করে।
  2. অন্য ইউজাররা যখন একই ডেটা অ্যাক্সেস করার চেষ্টা করবে, তখন তাদের ট্রানজেকশন তখন পর্যন্ত আটকে থাকবে যতক্ষণ না প্রথম ইউজার ডেটা সম্পন্ন করে।

উপকারিতা:

  • High contention environments এর জন্য উপযুক্ত (যেখানে একাধিক ইউজার একই ডেটা অ্যাক্সেস করতে পারে)।
  • কোনো কনফ্লিক্ট হওয়ার সম্ভাবনা কম।

সীমাবদ্ধতা:

  • Performance overhead তৈরি হতে পারে কারণ একাধিক থ্রেড একই ডেটা অ্যাক্সেস করার চেষ্টা করলে তাদের অপেক্ষা করতে হয়।
  • লকিংয়ের কারণে deadlock সৃষ্টি হতে পারে, যদি সঠিকভাবে পরিচালনা না করা হয়।

৩. Optimistic vs Pessimistic Locking

AspectOptimistic LockingPessimistic Locking
Locking ApproachNo locks, checks for version conflicts.Locks the data to prevent access by others.
Best ForLow contention environments.High contention environments.
ConcurrencyHigh concurrency, multiple users can work at once.Low concurrency, blocks other users until transaction finishes.
PerformanceBetter performance when contention is low.Can lead to performance degradation due to blocking.
Conflict HandlingHandles conflict by version checking.Handles conflict by locking data.
Risk of DeadlockMinimal.Higher risk if not managed properly.

সারাংশ


Optimistic Locking এবং Pessimistic Locking হল JPA-তে ডেটাবেসের ট্রানজেকশন কন্ট্রোল করার দুটি পদ্ধতি। Optimistic Locking কম কনটেনশন পরিস্থিতিতে কার্যকরী, যেখানে ডেটা কনফ্লিক্ট কম হওয়ার সম্ভাবনা থাকে এবং এটি কার্যকরভাবে version checking এর মাধ্যমে কনফ্লিক্ট রোধ করে। অন্যদিকে, Pessimistic Locking উচ্চ কনটেনশন পরিস্থিতিতে কার্যকরী, যেখানে ডেটা lock করার মাধ্যমে একসাথে একাধিক ইউজারের পরিবর্তন রোধ করা হয়। এই দুটি পদ্ধতি আপনার অ্যাপ্লিকেশন এবং ডেটাবেসের কনটেক্সট অনুযায়ী কার্যকরভাবে ব্যবহৃত হতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...