NHibernate-এ Versioning এবং Timestamp দুটি গুরুত্বপূর্ণ কৌশল যা Optimistic Concurrency Control (OCC) এর আওতায় ডেটাবেসে একাধিক ইউজার বা থ্রেডের মধ্যে ডেটার সংঘর্ষ বা কনকারেন্সি সমস্যা এড়াতে ব্যবহৃত হয়। এটি বিশেষ করে সেই পরিস্থিতিতে গুরুত্বপূর্ণ যেখানে একাধিক ইউজার একই ডেটা আপডেট করার চেষ্টা করে।
Versioning
Versioning হল একটি কৌশল যেখানে একটি version বা timestamp ফিল্ড ব্যবহৃত হয় যেটি একটি নির্দিষ্ট রেকর্ডের সংস্করণ বা সময়কে ট্র্যাক করে। এই ফিল্ডের সাহায্যে NHibernate নিশ্চিত করে যে একটি রেকর্ড শুধুমাত্র তখনই আপডেট করা যাবে যদি তার সংস্করণটি সঠিক থাকে।
উদাহরণ:
ধরা যাক, আমাদের একটি Product টেবিল রয়েছে, যেখানে একটি Version ফিল্ড সংযুক্ত করা হয়েছে:
public class Product
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual decimal Price { get; set; }
// Versioning field
public virtual int Version { get; set; }
}
এখানে:
Versionপ্রপার্টি হল সেই ফিল্ড যা রেকর্ডের সংস্করণ বা ভার্সন নম্বর ট্র্যাক করে।
Mapping with Fluent NHibernate:
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Table("Products");
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name).Not.Nullable();
Map(x => x.Price).Not.Nullable();
// Versioning field
Version(x => x.Version);
}
}
এখানে:
Version(x => x.Version): এটি NHibernate কে বলে যে,Versionফিল্ডটি একটি optimistic concurrency control ফিল্ড, যা NHibernate দ্বারা ডেটাবেসে রেকর্ড আপডেটের সময় চেক করা হবে।
Versioning-এর কাজ কিভাবে হয়?
যখন আপনি একটি রেকর্ড আপডেট করেন, NHibernate এটি যাচাই করে যে আপডেট করার পূর্ববর্তী রেকর্ডের সংস্করণ এবং বর্তমান সংস্করণ মিলছে কিনা। যদি সংস্করণটি পরিবর্তিত হয়ে থাকে (অর্থাৎ অন্য কোনো ইউজার বা থ্রেড রেকর্ডটি আগে আপডেট করেছে), তবে NHibernate একটি OptimisticLockException ছুঁড়ে দিবে।
Timestamp
Timestamp হল একটি ডেটাবেস কলাম যা রেকর্ডের সর্বশেষ আপডেট সময় ট্র্যাক করে। এটি মূলত একই রকমভাবে কাজ করে যেমন Versioning, তবে এটি একটি টাইমস্ট্যাম্প ব্যবহার করে যা সাধারণত DateTime টাইপের হয়।
উদাহরণ:
একটি Product ক্লাসে টাইমস্ট্যাম্প ব্যবহার করার জন্য:
public class Product
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual decimal Price { get; set; }
// Timestamp field
public virtual DateTime LastUpdated { get; set; }
}
এখানে:
LastUpdatedহল সেই ফিল্ড যা রেকর্ডের সর্বশেষ পরিবর্তনের সময় ট্র্যাক করবে।
Mapping with Fluent NHibernate:
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Table("Products");
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name).Not.Nullable();
Map(x => x.Price).Not.Nullable();
// Timestamp field
Map(x => x.LastUpdated).CustomType("timestamp");
}
}
এখানে:
CustomType("timestamp"): এই কাস্টম টাইপ নির্দেশ করে যে,LastUpdatedফিল্ডটি একটি টাইমস্ট্যাম্প ফিল্ড এবং NHibernate এই কলামটি রেকর্ড আপডেট করার সময় ব্যবহার করবে।
Timestamp-এর কাজ কিভাবে হয়?
টাইমস্ট্যাম্প ফিল্ডে সাধারণত ডেটাবেস দ্বারা স্বয়ংক্রিয়ভাবে সময় যোগ করা হয় যখন একটি রেকর্ড তৈরি বা আপডেট হয়। যখন আপনি একটি রেকর্ড আপডেট করার চেষ্টা করবেন, NHibernate সিস্টেমে যাচাই করবে যে LastUpdated টাইমস্ট্যাম্পটি গত আপডেটের পর পরিবর্তিত হয়েছে কিনা। যদি টাইমস্ট্যাম্প পরিবর্তিত হয়ে থাকে, তবে অর্থাৎ অন্য কেউ রেকর্ডটি পরিবর্তন করেছে, তখন NHibernate একটি OptimisticLockException তৈরি করবে।
Versioning vs Timestamp
- Versioning ফিল্ডটি সাধারণত একটি সংখ্যা হিসেবে কাজ করে (যেমন
intবাlong), যা রেকর্ডের প্রতি পরিবর্তনের জন্য বৃদ্ধি পায়। - Timestamp ফিল্ডটি সাধারণত একটি
DateTimeস্টাইলের ফিল্ড যা রেকর্ডের সর্বশেষ পরিবর্তন সময় ট্র্যাক করে।
কখন কোনটি ব্যবহার করবেন?
- Versioning: যখন আপনাকে একটি নির্দিষ্ট সংখ্যক পরিবর্তনের ট্র্যাক রাখতে হবে এবং আপডেটের জন্য একটি সংখ্যা ব্যবহার করতে চান।
- Timestamp: যখন আপনাকে সময়ের উপর ভিত্তি করে কনকারেন্সি নিয়ন্ত্রণ করতে হবে এবং ডেটাবেসের সর্বশেষ আপডেট সময় প্রয়োজন।
উপসংহার
NHibernate-এ Versioning এবং Timestamp দুটি কৌশল Optimistic Concurrency Control নিশ্চিত করার জন্য ব্যবহৃত হয়। Versioning এবং Timestamp ফিল্ড ব্যবহারের মাধ্যমে, আপনি ডেটাবেসে ডেটার একাধিক ইউজারের মধ্যে সংঘর্ষ বা কনকারেন্সি সমস্যা কমাতে পারেন। Versioning সংখ্যা ব্যবহার করে সংস্করণ ট্র্যাক করে, আর Timestamp সময় ব্যবহার করে সর্বশেষ পরিবর্তন চিহ্নিত করে।
Read more