Optimistic Concurrency Control (OCC) একটি কৌশল যা ডেটাবেসের একাধিক ব্যবহারকারী বা প্রক্রিয়া যখন একই রেকর্ডে একসাথে কাজ করে, তখন কনফ্লিক্ট বা প্রতিযোগিতা (race condition) থেকে বাঁচতে ব্যবহৃত হয়। এটি ডেটাবেসে ডেটা কনফ্লিক্টের সম্ভাবনা কমাতে সহায়তা করে।
Optimistic Concurrency বিশেষভাবে ব্যবহার করা হয় যখন আপনি মনে করেন যে, একাধিক ব্যবহারকারী একসাথে একই ডেটাতে কাজ করার সময় খুব কম কনফ্লিক্ট হবে। এর মধ্যে, ডেটাবেসে কোনও রেকর্ড আপডেট করার আগে, কোনো লকিং মেকানিজম ব্যবহৃত হয় না। পরিবর্তে, আপডেট করার সময় সেই রেকর্ডের আগের অবস্থা চেক করা হয় এবং যদি ডেটা পরিবর্তিত হয়ে থাকে, তাহলে Concurrency Exception ঘটানো হয়।
Optimistic Concurrency Control এর কাজের ধাপ
Optimistic Concurrency Control প্যাটার্নে মূলত তিনটি ধাপ থাকে:
- লক্ষ্য রেকর্ডটি পড়া: প্রথমে, ডেটাবেস থেকে রেকর্ডটি পড়া হয়। এক্ষেত্রে রেকর্ডের সাথে এমন কিছু অতিরিক্ত তথ্য (যেমন, Timestamp বা RowVersion) সংরক্ষিত করা হয় যা পরে পরিবর্তনের সাথে সঠিকতা যাচাই করতে সাহায্য করবে।
- রেকর্ডের উপর পরিবর্তন করা: এরপর, অ্যাপ্লিকেশন বা ব্যবহারকারী সেই রেকর্ডের উপরে পরিবর্তন করে এবং একটি Save Changes অপারেশন শুরু হয়।
- পরিবর্তন যাচাই: আপডেটের সময়, ডেটাবেস চেক করে দেখবে যে, রেকর্ডটি তার মূল অবস্থায় রয়েছে কি না। যদি রেকর্ডটি অন্য কেউ আপডেট করে থাকে, তাহলে Concurrency Conflict ঘটবে এবং একটি Optimistic Concurrency Exception ছুঁড়ে দেওয়া হবে।
Optimistic Concurrency Example
ধরা যাক, আপনি একটি Student টেবিল পরিচালনা করছেন যেখানে প্রতিটি ছাত্রের জন্য একটি RowVersion কলাম রয়েছে। এই কলামটি ডেটাবেসে প্রতিটি রেকর্ডের সময় বা পরিবর্তন ট্র্যাক করতে ব্যবহৃত হয়।
Entity Class Example (Optimistic Concurrency):
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public int Age { get; set; }
[Timestamp] // This annotation marks the RowVersion column for concurrency checking
public byte[] RowVersion { get; set; }
}
এখানে:
RowVersionএকটি Timestamp কলাম যা সিস্টেম ডেটাবেসে প্রতিটি রেকর্ডের পরিবর্তনের সময় ট্র্যাক করে।
DbContext Class Example (Optimistic Concurrency):
public class ApplicationDbContext : DbContext
{
public DbSet<Student> Students { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.Property(p => p.RowVersion)
.IsRowVersion(); // Configuring RowVersion for concurrency handling
}
}
এখানে:
IsRowVersion()Fluent API দিয়েRowVersionকলামটি কনফিগার করা হয়েছে যাতে এটি কনকারেন্সি চেকিংয়ের জন্য ব্যবহৃত হয়।
Optimistic Concurrency Exception Handling
এখন, যদি দুজন ব্যবহারকারী একই সময়ে একই ছাত্রের ডেটা আপডেট করার চেষ্টা করে, তবে Optimistic Concurrency এ কনফ্লিক্ট হবে এবং Concurrency Exception ঘটবে। এই ধরনের কনফ্লিক্ট হ্যান্ডেল করতে হলে, কনফ্লিক্ট নির্ধারণের পরে অ্যাপ্লিকেশনটিকে সেই ডেটাকে পুনরায় লোড করে ব্যবহারকারীকে অবহিত করতে হবে, অথবা ব্যবহারকারীকে নতুন করে ডেটা আপডেট করার সুযোগ দিতে হবে।
Example Code (Handling Optimistic Concurrency Conflict):
try
{
var student = db.Students.FirstOrDefault(s => s.StudentId == 1);
student.Name = "Updated Name";
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
// Handle concurrency conflict
Console.WriteLine("Concurrency conflict detected! The record has been modified by someone else.");
}
এখানে:
DbUpdateConcurrencyExceptionএক ধরনের Exception যা সংঘটিত হয় যখন ডেটাবেসে একই রেকর্ড আপডেট করার জন্য দুই বা ততোধিক প্রক্রিয়া চেষ্টা করে।
Optimistic Concurrency Pattern এর সুবিধা ও সীমাবদ্ধতা
সুবিধাসমূহ:
- ডেটা অ্যাক্সেসের জন্য লকিং প্রয়োজন নেই: Optimistic concurrency এ ডেটাবেসের রেকর্ড লক করা হয় না, যা অনেক বেশি স্কেলেবল এবং পারফরম্যান্স উন্নত করে।
- বাড়তি লকিং ও Wait Time কমানো: যখন কনফ্লিক্ট হয় না, তখন অন্য ব্যবহারকারীদের জন্য কোনো বিলম্ব হয় না।
- লোড হালকা: একটি ডেটা রেকর্ড একাধিক ব্যবহারকারী একসাথে পড়তে পারে এবং পরিবর্তন না হলে তারা কোনো সমস্যা ছাড়াই কাজ করতে পারে।
সীমাবদ্ধতা:
- কনফ্লিক্টের সম্ভাবনা: যদি অনেক ব্যবহারকারী একই রেকর্ডে একসাথে কাজ করে, তবে কনফ্লিক্ট বেশি হওয়ার সম্ভাবনা থাকে। কনফ্লিক্ট হ্যান্ডলিং যথাযথভাবে না করলে, অ্যাপ্লিকেশনের অভিজ্ঞতা খারাপ হতে পারে।
- তথ্য হারানোর ঝুঁকি: কখনও কখনও কনফ্লিক্ট হ্যান্ডলিং বা কনফ্লিক্টের পর সিদ্ধান্ত নেওয়া কঠিন হতে পারে, যার ফলে তথ্য হারাতে পারে।
- কনফ্লিক্ট সমাধানের পদ্ধতি: কনফ্লিক্ট সমাধানের সময় ব্যবহারকারীকে উপযুক্তভাবে অবহিত করা এবং একটি কার্যকর পদ্ধতি গ্রহণ করা প্রয়োজন, যা সময়সাপেক্ষ এবং অতিরিক্ত প্রোগ্রামিং প্রয়োজন।
Optimistic Concurrency এবং Entity Framework
Entity Framework-এ Optimistic Concurrency কনফিগার করতে RowVersion বা Timestamp কলাম ব্যবহার করা হয়। EF সঠিকভাবে Concurrency Conflict হ্যান্ডলিং করে এবং একাধিক ব্যবহারকারী একই রেকর্ড আপডেট করার সময় Optimistic Concurrency Exception ছুঁড়ে দেয়।
এটি Concurrency Control প্যাটার্ন হিসেবে কার্যকর এবং বিশেষ করে সিস্টেমে যেখানে রেকর্ডের আপডেট রেট কম, সেখানে ভালো ফল দেয়।
Read more