Locking এর প্রয়োজনীয়তা এবং @Version এনোটেশন

JPA তে Optimistic এবং Pessimistic Locking - জেপিএ  (JPA) - Java Technologies

337

JPA (Java Persistence API) তে Locking এবং @Version এনোটেশন ডেটাবেসে ডেটার কনকারেন্ট এক্সেস এবং ডেটা ইন্টিগ্রিটি বজায় রাখতে অত্যন্ত গুরুত্বপূর্ণ। বিশেষত, যখন একাধিক ক্লায়েন্ট বা থ্রেড একই ডেটা পরিবর্তন করতে পারে, তখন ডেটা সংঘর্ষ (concurrency conflicts) এবং ডেটা হারানো (lost updates) এড়াতে locking mechanisms ব্যবহৃত হয়।

Locking এর প্রয়োজনীয়তা


Locking হলো এমন একটি প্রক্রিয়া যা ডেটাবেসে একাধিক থ্রেড বা ক্লায়েন্টের মধ্যে ডেটার অ্যাক্সেস নিয়ন্ত্রণ করে। এটি ডেটাবেসে একসাথে একাধিক ক্লায়েন্ট বা ব্যবহারকারীর এক্সেস থেকে ডেটা সুরক্ষিত রাখতে সাহায্য করে।

Locking দুটি প্রধান ধরনের হতে পারে:

  1. Optimistic Locking
  2. Pessimistic Locking

1. Optimistic Locking:

Optimistic Locking ব্যবহৃত হয় যখন মনে করা হয় যে একাধিক ট্রানজেকশন একে অপরের সাথে সংঘর্ষ করবে না। এই পদ্ধতিতে, ডেটা পড়ার সময় একটি "version" নম্বর যোগ করা হয়, এবং যখন ট্রানজেকশন ডেটা আপডেট করার চেষ্টা করে, তখন সেই "version" নম্বর চেক করা হয়। যদি অন্য কোনো ট্রানজেকশন ইতোমধ্যে ডেটা আপডেট করে থাকে, তবে এক্সেস প্রত্যাখ্যান করা হয় এবং একটি Optimistic Lock Exception ছোঁড়া হয়।

2. Pessimistic Locking:

Pessimistic Locking ব্যবহৃত হয় যখন একাধিক ট্রানজেকশন একই ডেটাকে পরিবর্তন করার চেষ্টা করবে এমন অনুমান করা হয়। এই পদ্ধতিতে, যখন একটি ট্রানজেকশন ডেটাকে লক করে, তখন অন্য ট্রানজেকশন সেই ডেটাতে কোনো পরিবর্তন করতে পারে না যতক্ষণ না প্রথম ট্রানজেকশন লক মুক্ত করে।

@Version এনোটেশন


JPA তে Optimistic Locking ব্যবহার করতে হলে, Entity ক্লাসে @Version এনোটেশন যোগ করা হয়। @Version এনোটেশন একটি ফিল্ড (সাধারণত একটি সংখ্যা বা timestamp) নির্ধারণ করে, যা Entity এর প্রতিটি সংস্করণ ট্র্যাক করে। যখন Entity আপডেট করা হয়, তখন @Version ফিল্ডটির মানও পরিবর্তিত হয়। যদি একই Entity কোনো একাধিক থ্রেড বা ক্লায়েন্ট দ্বারা আপডেট করা হয়, তখন @Version ফিল্ডটি চেক করে সিঙ্ক্রোনাইজেশন নিশ্চিত করা হয়।

@Version এর কাজ:

  • @Version ফিল্ডটি Entity-এর সংস্করণ সংখ্যা ট্র্যাক করে। যখন Entity আপডেট করা হয়, তখন সংস্করণ সংখ্যাটি বৃদ্ধি পায়।
  • যদি একটি Entity একটি পুরানো সংস্করণে আপডেট করার চেষ্টা করা হয় (অথবা কনকারেন্ট আপডেট করা হয়), তখন OptimisticLockException ছোঁড়া হয়।

@Version উদাহরণ:

import javax.persistence.*;

@Entity
public class User {

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

    private String name;
    private int age;

    @Version
    private Long version;  // Version field to enable Optimistic Locking

    // Getter এবং Setter methods
}

এখানে:

  • @Version অ্যানোটেশন version ফিল্ডটিকে একটি ভার্সন নম্বর হিসেবে চিহ্নিত করেছে।
  • যখন Entity আপডেট হবে, তখন এই ভার্সন নম্বর চেক করা হবে। যদি এই Entity এর ভার্সন নম্বর অন্যান্য থ্রেড বা ট্রানজেকশনে পরিবর্তিত হয়ে থাকে, তাহলে OptimisticLockException ত্রুটি ছোঁড়া হবে।

Optimistic Locking এর উদাহরণ:

EntityManager entityManager = entityManagerFactory.createEntityManager();

// প্রথমবার Entity লোড
User user = entityManager.find(User.class, 1L);

// দ্বিতীয় ট্রানজেকশনে Entity আপডেট করার চেষ্টা
User sameUser = entityManager.find(User.class, 1L);
sameUser.setAge(35);

// যদি version পরিবর্তন হয়ে থাকে এবং দুইটি ট্রানজেকশন একে অপরের সাথে কনকারেন্টলি কাজ করে, তবে একটি OptimisticLockException ত্রুটি ছোঁড়া হবে।
entityManager.getTransaction().begin();
entityManager.merge(sameUser);
entityManager.getTransaction().commit();

এখানে, যদি প্রথম ট্রানজেকশন user Entity আপডেট করে এবং দ্বিতীয় ট্রানজেকশন একই Entity আপডেট করার চেষ্টা করে, তবে OptimisticLockException ছোঁড়া হবে যদি সংস্করণ নম্বর একে অপরের সাথে মেলেনি।

Pessimistic Locking


Pessimistic Locking ব্যবহৃত হয় যখন আমাদের নিশ্চিত করতে হয় যে একটি Entity একে অপরের সাথে সংঘর্ষ না করে শুধুমাত্র একটি ট্রানজেকশন দ্বারা একসাথে আপডেট হবে। Pessimistic Locking ব্যবহার করে, আমরা ডেটাবেসে একটি Entity লক করতে পারি যাতে অন্য কোন ট্রানজেকশন একই Entity এ পরিবর্তন না করতে পারে যতক্ষণ না প্রথম ট্রানজেকশন সম্পন্ন হয়।

Pessimistic Locking উদাহরণ:

import javax.persistence.*;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private int age;

    // Getter এবং Setter methods
}

EntityManager entityManager = entityManagerFactory.createEntityManager();

// Pessimistic Locking - Entity কে লক করা হবে
User user = entityManager.find(User.class, 1L, LockModeType.PESSIMISTIC_WRITE);
user.setAge(35);

entityManager.getTransaction().begin();
entityManager.merge(user);
entityManager.getTransaction().commit();

এখানে, LockModeType.PESSIMISTIC_WRITE ব্যবহৃত হয়েছে যাতে Entity write lock হয়, যার মাধ্যমে অন্য কোনো ট্রানজেকশন একই Entity কে আপডেট করতে পারবে না যতক্ষণ না লক মুক্ত হয়।


Locking এবং Transaction Management


Locking সাধারণত Transaction Management এর সাথে যুক্ত হয়। JPA তে, ডেটাবেস অপারেশনগুলো ট্রানজেকশন ব্লকের মধ্যে হয় এবং লকিং প্রয়োগ করার সময় transaction boundaries নিশ্চিত করতে হয়। এটি ডেটার একসাথে পরিবর্তন বা অ্যাক্সেস এর সময় ডেটার সঠিকতা এবং ইন্টিগ্রিটি বজায় রাখতে সহায়তা করে।


সার্বিক পর্যালোচনা


Locking JPA তে ডেটার কনকারেন্ট এক্সেস ম্যানেজমেন্ট এবং ডেটা ইন্টিগ্রিটি বজায় রাখতে গুরুত্বপূর্ণ। @Version এনোটেশন Optimistic Locking নিশ্চিত করতে ব্যবহৃত হয়, যা ডেটার আপডেটের সময় সংঘর্ষ (concurrency conflict) এড়ায়। অন্যদিকে, Pessimistic Locking ডেটাকে সুরক্ষিত রাখতে এবং একাধিক ট্রানজেকশনের মধ্যে ডেটার একসাথে পরিবর্তন রোধ করতে ব্যবহৃত হয়। দুটি Locking পদ্ধতিই JPA তে ডেটা সুরক্ষা এবং পারফরম্যান্স অপ্টিমাইজ করতে সহায়তা করে।

Content added By
Promotion

Are you sure to start over?

Loading...