TypeORM এ Optimistic এবং Pessimistic Locking
Locking হল একটি প্রক্রিয়া যেখানে একাধিক ইউজার বা থ্রেড যখন একই ডেটাবেস রেকর্ডের উপর কাজ করতে যায়, তখন সেই ডেটার নিরাপত্তা এবং সঠিকতা নিশ্চিত করতে লকিং ব্যবহার করা হয়।
TypeORM এ, Optimistic Locking এবং Pessimistic Locking দুটি পদ্ধতি রয়েছে যা ডেটাবেসে Concurrency Control বা একাধিক ইউজারের মধ্যে ডেটার কনকারেন্ট এক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়। এই দুটি পদ্ধতির মধ্যে প্রধান পার্থক্য হলো তাদের লকিং কৌশল এবং ব্যবহারের সময়কাল।
১. Optimistic Locking
Optimistic Locking একটি কৌশল যেখানে ডেটার উপর লক প্রয়োগ করা হয় না, বরং ডেটা ফেচ করার সময় একটি version ফিল্ড ব্যবহার করা হয়। যখন ইউজার বা থ্রেড ডেটা আপডেট করতে যায়, তখন সে একটি চেক করে দেখে যে ডেটা আর পরিবর্তিত হয়নি কি না (version চেক করে)। যদি ডেটা পরিবর্তিত না হয়ে থাকে, তাহলে পরিবর্তন করা যায়, না হলে একটি কনফ্লিক্টের বার্তা প্রদান করা হয়।
Optimistic Locking সাধারণত উচ্চ transaction volume এবং low contention সিচুয়েশনে ব্যবহৃত হয়, যেখানে একাধিক ইউজার একই সময়ে একাধিক রেকর্ডের সাথে কাজ করে, তবে খুব কমই একে অপরের সাথে সংঘর্ষ হয়।
Optimistic Locking এর ব্যবহার:
TypeORM এ Optimistic Locking ব্যবহার করতে, আপনি একটি version ফিল্ড তৈরি করবেন, যেটি প্রতিবার রেকর্ড আপডেট করার সময় বৃদ্ধি পাবে। প্রতিবার আপডেট করার আগে, TypeORM চেক করবে যে রেকর্ডের version আগের মতো আছে কি না।
উদাহরণ:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
price: number;
@Column()
version: number; // Version column for optimistic locking
}
এখানে, version ফিল্ডটি প্রতি আপডেটে বৃদ্ধি পাবে। TypeORM যখন একটি রেকর্ড আপডেট করবে, তখন এটি চেক করবে যে বর্তমান version ফিল্ডটি আগের মতো রয়েছে কি না।
Update Example:
const productRepository = connection.getRepository(Product);
const product = await productRepository.findOne({ where: { id: 1 } });
product.price = 100;
// Optimistic Locking: Check if version is still the same
await productRepository.save(product);
এখানে, version ফিল্ডটি TypeORM দ্বারা স্বয়ংক্রিয়ভাবে পরিচালিত হয় এবং যদি কোনো কনফ্লিক্ট পাওয়া যায়, তাহলে OptimisticLockVersionMismatchError ফেলা হবে।
২. Pessimistic Locking
Pessimistic Locking হল একটি কৌশল যেখানে ডেটার উপর লক প্রয়োগ করা হয় যাতে অন্য কোনো ইউজার বা থ্রেড ডেটাকে এক্সেস বা পরিবর্তন করতে না পারে। এটি সাধারণত high contention সিচুয়েশনে ব্যবহৃত হয়, যেখানে একাধিক ইউজার একই ডেটার সাথে একযোগভাবে কাজ করে এবং সংঘর্ষের সম্ভাবনা বেশি থাকে।
Pessimistic Locking ডেটার ওপর সরাসরি লক প্রয়োগ করে, যাতে অন্য ইউজার সেই ডেটা পরিবর্তন করতে না পারে যতক্ষণ না বর্তমান থ্রেড ডেটাটি সম্পূর্ণভাবে ব্যবহার ও আপডেট করে।
Pessimistic Locking এর ব্যবহার:
TypeORM-এ Pessimistic Locking ব্যবহার করার জন্য lock() মেথড ব্যবহার করতে হয়। এই মেথড ডেটা লক করতে সাহায্য করে, যার মাধ্যমে কোনো থ্রেড বা ইউজার একসাথে একাধিক রেকর্ড বা একক রেকর্ডে কাজ করতে পারে।
উদাহরণ:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
price: number;
}
এখানে, Product এন্টিটির রেকর্ড লক করতে lock() ব্যবহার করা যাবে।
Select with Pessimistic Lock:
const productRepository = connection.getRepository(Product);
// Pessimistic Locking: Lock the record for update
const product = await productRepository.findOne({
where: { id: 1 },
lock: { mode: "pessimistic_write" }
});
product.price = 200;
// Save the product after modifying the locked record
await productRepository.save(product);
এখানে, lock: { mode: "pessimistic_write" } ব্যবহার করে আমরা Pessimistic Locking প্রয়োগ করেছি, যার মাধ্যমে Product রেকর্ডটি আপডেট হওয়ার আগ পর্যন্ত অন্য ইউজার বা থ্রেড এটিকে পরিবর্তন করতে পারবে না।
Pessimistic Locking এর ধরন:
pessimistic_read: রেকর্ডটি শুধু পড়ার জন্য লক করা হয়।pessimistic_write: রেকর্ডটি পড়া এবং লেখার জন্য লক করা হয়, অন্য কোনো থ্রেড বা ইউজার এই রেকর্ডের উপর কাজ করতে পারবে না।
সারাংশ
Optimistic Locking এবং Pessimistic Locking দুটি ভিন্ন পদ্ধতি, যা ডেটাবেসের সাথে একাধিক থ্রেড বা ইউজারের এক্সেস কন্ট্রোল করতে সাহায্য করে।
- Optimistic Locking: ডেটার উপর লক প্রয়োগ না করে একটি version ফিল্ড ব্যবহার করে সংঘর্ষ চেক করা হয়। এটি সাধারণত কম সংঘর্ষ এবং উচ্চ কর্মক্ষমতার জন্য উপযুক্ত।
- Pessimistic Locking: ডেটার উপর সরাসরি লক প্রয়োগ করে, অন্য থ্রেড বা ইউজারকে ডেটার সাথে কাজ করতে বাধা দেয় যতক্ষণ না বর্তমান থ্রেড ডেটার অপারেশন সম্পন্ন করে।
TypeORM এ এই দুটি কৌশল ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশন বা ডেটাবেসে Concurrency Control প্রক্রিয়া দক্ষভাবে পরিচালনা করতে পারেন। Optimistic Locking কম সংঘর্ষের ক্ষেত্রে এবং Pessimistic Locking উচ্চ সংঘর্ষের পরিস্থিতিতে কার্যকরীভাবে কাজ করে।
Read more