Row Versioning এবং Timestamp হল Entity Framework (EF) এবং অন্যান্য ডেটাবেস সিস্টেমে ডেটার কনকারেন্ট অ্যাক্সেস এবং Concurrency Control নিশ্চিত করার জন্য ব্যবহৃত দুটি গুরুত্বপূর্ণ প্রযুক্তি। এই প্রযুক্তিগুলি একে অপরকে পরিপূরক করে এবং ডেটাবেসে একই ডেটা একাধিক ব্যবহারকারী বা প্রক্রিয়া দ্বারা আপডেট করার সময়ে কনফ্লিক্ট এবং ডেটা ক্ষতি থেকে রক্ষা করতে সাহায্য করে।
Row Versioning একটি ডেটাবেস কৌশল, যা ডেটা পরিবর্তনের সময় ডেটা আপডেট এবং কনকারেন্ট অ্যাক্সেস পরিচালনা করতে ব্যবহৃত হয়। Row Versioning এর মাধ্যমে, যখন একটি রেকর্ডে কোনো পরিবর্তন হয়, তখন সেই রেকর্ডের জন্য একটি unique version number (বা timestamp) তৈরি হয়। এটি ডেটাবেসের মধ্যে ডেটার প্রতিটি রোকে একটি অনন্য সংস্করণ ইন্ডিকেটর প্রদান করে, যা নিশ্চিত করে যে ডেটা পরিবর্তনের সময় কোনো কনফ্লিক্ট হয়নি।
EF তে, Row Versioning সাধারণত timestamp বা rowversion ডেটাটাইপ ব্যবহার করে।
ধরা যাক, আমাদের একটি Product
টেবিল রয়েছে, যেখানে আমরা একটি RowVersion
কলাম ব্যবহার করতে চাই যা ডেটা আপডেটের সময় ভার্সন ট্র্যাক করবে।
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
// RowVersion/ Timestamp column for concurrency control
[Timestamp]
public byte[] RowVersion { get; set; }
}
এখানে:
RowVersion
ফিল্ড হিসেবে ব্যবহৃত হবে এবং এটি কনকারেন্ট আপডেট ট্র্যাক করবে।byte[]
টাইপের RowVersion
কলামটি ডেটাবেসে একটি timestamp বা rowversion ডেটাটাইপ হিসেবে মান্য হবে, যা একটি বাইনারি টাইপ।Timestamp ডেটাবেসের একটি বিশেষ ধরনের কলাম যা একে অপরের মধ্যে ভিন্ন ভিন্ন ডেটা ভার্সন ট্র্যাক করতে ব্যবহৃত হয়। এটি মূলত একটি auto-generated ফিল্ড, যা প্রতিটি রেকর্ডে একটি ইউনিক বাইনারি মান (যেমন: byte[]
বা Guid
) ধারণ করে, যা যখন ডেটা আপডেট হয়, তখন পরিবর্তিত হয়।
EF তে Timestamp এবং RowVersion সাধারণত একে অপরের প্রতিস্থাপক হিসেবে ব্যবহৃত হয়, যদিও তাদের টেকনিকালি কিছু পার্থক্য থাকতে পারে (যেমন Timestamp
মূলত একটি SQL সার্ভার ডেটাটাইপ, তবে RowVersion
ও একই উদ্দেশ্যে ব্যবহৃত হতে পারে)।
আপনি EF তে একটি RowVersion কলাম ব্যবহার করলে, এটি ডেটাবেসের প্রতিটি রেকর্ডের জন্য একটি version number তৈরি করে, যা ডেটার আপডেটের সময় পরীক্ষা করা হয়। যখন আপনি রেকর্ড আপডেট করার চেষ্টা করেন, তখন EF পরীক্ষা করে যে আপনি যে ভার্সনটি আপডেট করতে চাইছেন, সেটি এখনও ডেটাবেসে বর্তমান আছে কিনা। যদি অন্য কোনো ব্যবহারকারী বা প্রক্রিয়া ইতিমধ্যে সেই রেকর্ড আপডেট করে থাকে, তাহলে EF আপনাকে একটি ConcurrencyException ছুড়ে দিবে, এবং আপনি একটি কনফ্লিক্ট সম্পর্কে অবহিত হবেন।
RowVersion
বা Timestamp
প্রপার্টি যোগ করুন, যাতে EF ডেটাবেসে এই প্রপার্টিকে একটি কনকারেন্ট কন্ট্রোল কলাম হিসেবে ব্যবহার করে।public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
// RowVersion attribute for concurrency control
[Timestamp]
public byte[] RowVersion { get; set; }
}
Add-Migration AddRowVersionToProduct
Update-Database
এটি ডেটাবেসে RowVersion কলাম তৈরি করবে যা timestamp ডেটাটাইপ হিসেবে হবে।
using (var context = new YourDbContext())
{
var product = context.Products.FirstOrDefault(p => p.ProductId == 1);
if (product != null)
{
// Update the product's price
product.Price = 20.99M;
try
{
context.SaveChanges(); // Will check for concurrency conflict
}
catch (DbUpdateConcurrencyException ex)
{
// Handle concurrency conflict
Console.WriteLine("Concurrency conflict occurred.");
}
}
}
এখানে, SaveChanges() কল করার সময় EF চেক করবে যে RowVersion
কলামের মান আগের মত আছে কিনা, যদি না থাকে, তাহলে DbUpdateConcurrencyException ছুড়ে দেবে।
RowVersion বা Timestamp ব্যবহারের মাধ্যমে আপনি ডেটাবেসের ভার্সন ট্র্যাক করতে পারেন, যা অনেক সময় পারফরম্যান্সে সাহায্য করে। তবে, যদি একটি অ্যাপ্লিকেশন বা সিস্টেমে উচ্চমাত্রার কনকারেন্ট অ্যাক্সেস ঘটে, তবে ভার্সনিংয়ের ফলে কিছু পারফরম্যান্স ইস্যু হতে পারে (যেমন: অতিরিক্ত ডেটাবেস চেক), তবে এটি তুলনামূলকভাবে নিরাপত্তা এবং ডেটা অখণ্ডতার জন্য গুরুত্বপূর্ণ।
common.read_more