এই পৃষ্ঠায় ট্রানজ্যাকশনাল ডেটা কনটেনশন, সিরিয়ালাইজেবিলিটি এবং আইসোলেশন বর্ণনা করা হয়েছে। ট্রানজ্যাকশন কোডের নমুনার জন্য, এর পরিবর্তে ট্রানজ্যাকশন এবং ব্যাচড রাইটস দেখুন।
লেনদেন এবং ডেটা বিরোধ
একটি ট্রানজ্যাকশন সফল হওয়ার জন্য, এর রিড অপারেশনের মাধ্যমে প্রাপ্ত ডকুমেন্টগুলো অবশ্যই ট্রানজ্যাকশনের বাইরের কোনো অপারেশন দ্বারা অপরিবর্তিত থাকতে হবে। যদি অন্য কোনো অপারেশন সেই ডকুমেন্টগুলোর কোনো একটি পরিবর্তন করার চেষ্টা করে, তবে সেই অপারেশনটি ট্রানজ্যাকশনটির সাথে ডেটা কনটেনশনের অবস্থায় প্রবেশ করে।
- ডেটা বিরোধ
- যখন দুই বা ততোধিক অপারেশন একই ডকুমেন্ট নিয়ন্ত্রণ করার জন্য প্রতিযোগিতা করে। উদাহরণস্বরূপ, একটি ট্রানজ্যাকশনের জন্য ডকুমেন্টটিকে অপরিবর্তিত রাখার প্রয়োজন হতে পারে, যখন একই সময়ে চলমান অন্য একটি অপারেশন সেই ডকুমেন্টের ফিল্ডের মানগুলো আপডেট করার চেষ্টা করে।
Cloud Firestore অপারেশনগুলোর মধ্যে একটিকে বিলম্বিত বা ব্যর্থ করে ডেটা বিরোধের সমাধান করে। Cloud Firestore ক্লায়েন্ট লাইব্রেরিগুলো ডেটা বিরোধের কারণে ব্যর্থ হওয়া ট্রানজ্যাকশনগুলোকে স্বয়ংক্রিয়ভাবে পুনরায় চেষ্টা করে। একটি নির্দিষ্ট সংখ্যক বার চেষ্টার পর, ট্রানজ্যাকশন অপারেশনটি ব্যর্থ হয় এবং একটি ত্রুটি বার্তা ফেরত দেয়:
ABORTED: Too much contention on these documents. Please try again.
কোন অপারেশনটি ব্যর্থ বা বিলম্বিত করা হবে, সেই সিদ্ধান্ত নেওয়ার ক্ষেত্রে আচরণটি কনকারেন্সি কন্ট্রোলের ধরনের উপর নির্ভর করে।
সমকালীন নিয়ন্ত্রণ
কনকারেন্সি মোড হলো একটি কনফিগারযোগ্য ডাটাবেস অপশন। Cloud Firestore নিম্নলিখিত কনকারেন্সি মোডগুলো সমর্থন করে:
PESSIMISTIC: হতাশাবাদী কনকারেন্সি কন্ট্রোল ধরে নেয় যে ডেটা নিয়ে বিরোধ বা সংঘাতের সম্ভাবনা রয়েছে। হতাশাবাদী ট্রানজ্যাকশনগুলো ডাটাবেস লক ব্যবহার করে অন্যান্য অপারেশনকে ডেটা পরিবর্তন করা থেকে বিরত রাখে।পেসিমিস্ট কনকারেন্সি কন্ট্রোলের ক্ষেত্রে, ট্রানজ্যাকশনগুলো যে ডকুমেন্টগুলো পড়ে সেগুলোর উপর লক স্থাপন করে। একটি ডকুমেন্টের উপর কোনো ট্রানজ্যাকশনের লক অন্যান্য ট্রানজ্যাকশন, ব্যাচড রাইট এবং নন-ট্রানজ্যাকশনাল রাইটকে সেই ডকুমেন্টটি পরিবর্তন করা থেকে বাধা দেয়। একটি ট্রানজ্যাকশন কমিট করার সময় তার ডকুমেন্ট লকগুলো ছেড়ে দেয়। এছাড়াও, টাইম আউট হলে বা যেকোনো কারণে ব্যর্থ হলেও এটি তার লকগুলো ছেড়ে দেয়।
যখন কোনো ট্রানজ্যাকশন একটি ডকুমেন্ট লক করে, তখন অন্যান্য রাইট অপারেশনগুলোকে অবশ্যই ট্রানজ্যাকশনটির লক মুক্ত করার জন্য অপেক্ষা করতে হয়। ট্রানজ্যাকশনগুলো কালানুক্রমিকভাবে তাদের লকগুলো অর্জন করে।
OPTIMISTIC): অপটিমিস্টিক কনকারেন্সি কন্ট্রোলগুলো ধরে নেয় যে ডেটা নিয়ে বিরোধের সম্ভাবনা নেই অথবা ডাটাবেস লক ধরে রাখা কার্যকর নয়। অপটিমিস্টিক ট্রানজ্যাকশনগুলো অন্যান্য অপারেশনকে ডেটা পরিবর্তন করা থেকে আটকাতে ডাটাবেস লক ব্যবহার করে না।অপটিমিস্টিক কনকারেন্সি কন্ট্রোলের মাধ্যমে, একটি ট্রানজ্যাকশন তার ভেতরে পড়া সমস্ত ডকুমেন্টের হিসাব রাখে। ট্রানজ্যাকশনটি তার লেখার কাজটি তখনই সম্পন্ন করে, যখন তার কার্য সম্পাদনের সময় সেই ডকুমেন্টগুলোর কোনোটি পরিবর্তিত হয় না। যদি কোনো ডকুমেন্ট পরিবর্তিত হয়ে যায়, তাহলে ট্রানজ্যাকশন হ্যান্ডলার ট্রানজ্যাকশনটি পুনরায় চেষ্টা করে। কয়েকবার চেষ্টা করার পরেও যদি ট্রানজ্যাকশনটি একটি ত্রুটিমুক্ত ফলাফল না পায়, তাহলে ডেটা কনটেনশনের কারণে ট্রানজ্যাকশনটি ব্যর্থ হয়ে যায়।
কনকারেন্সি মোডের ডিফল্ট
স্ট্যান্ডার্ড সংস্করণের জন্য ডিফল্ট হলো PESSIMISTIC । এন্টারপ্রাইজ সংস্করণের জন্য ডিফল্ট হলো OPTIMISTIC । তবে, এর আচরণ ক্লায়েন্ট লাইব্রেরির ধরনের উপরও নির্ভর করে:
মোবাইল/ওয়েব এসডিকে-গুলো অপটিমিস্টিক কনকারেন্সি কন্ট্রোল ব্যবহার করে। মোবাইল এবং ওয়েব এসডিকে-গুলো এই সেটিং থেকে স্বাধীনভাবে কাজ করে, কারণ তারা সর্বদা অপটিমিস্টিক কনকারেন্সি অনুকরণ করে।
সার্ভার ক্লায়েন্ট লাইব্রেরিগুলো ডাটাবেস সেটিংয়ের কনকারেন্সি কন্ট্রোল ব্যবহার করে।
মোবাইল/ওয়েব এসডিকে-তে ডেটা বিরোধ
মোবাইল এবং ওয়েব এসডিকে-গুলো ডকুমেন্ট ভার্সনের উপর রাইট প্রি-কন্ডিশন ব্যবহার করে অপটিমিস্টিক কনকারেন্সি ট্রানজ্যাকশন অনুকরণ করে। এই অনুকরণটি ডাটাবেসের কনকারেন্সি মোড সেটিং নির্বিশেষে ঘটে থাকে। মোবাইল এবং ওয়েব এসডিকে-গুলো বিল্ট-ইন ট্রানজ্যাকশন ফিচারটি ব্যবহার করে না, তাই ডাটাবেসের কনকারেন্সি মোড PESSIMISTIC হিসেবে কনফিগার করা থাকলেও মোবাইল ক্লায়েন্টগুলো অপটিমিস্টিক আচরণ করে।
মোবাইল/ওয়েব এসডিকে-গুলো অপটিমিস্টিক কনকারেন্সি কন্ট্রোল ব্যবহার করে, কারণ এগুলো উচ্চ ল্যাটেন্সি এবং অনির্ভরযোগ্য নেটওয়ার্ক সংযোগযুক্ত পরিবেশে কাজ করতে পারে। উচ্চ ল্যাটেন্সির পরিবেশে ডকুমেন্ট লক করলে অত্যধিক ডেটা কনটেনশন ফেইলর ঘটবে।
সার্ভার ক্লায়েন্ট লাইব্রেরিতে ডেটা বিরোধ
সার্ভার ক্লায়েন্ট লাইব্রেরিগুলো (C#, Go, Java, Node.js, PHP, Python, Ruby) বিল্ট-ইন ট্রানজ্যাকশন বৈশিষ্ট্য ব্যবহার করে। এই ট্রানজ্যাকশনগুলো ডাটাবেস-স্তরের কনকারেন্সি মোড সেটিং ব্যবহার করে এবং এর ডিফল্ট মান সংস্করণের উপর নির্ভর করে:
এন্টারপ্রাইজ সংস্করণ ডিফল্টরূপে অপটিমিস্টিক কনকারেন্সি কন্ট্রোল ব্যবহার করে, যা সম্পূর্ণ কালেকশন স্ক্যান করে এমন অপারেশনগুলোকে সমর্থন করে। অপটিমিস্টিক কনকারেন্সি কন্ট্রোল এমন স্ক্যান অপারেশন এড়াতে সাহায্য করে যা বিপুল সংখ্যক ডকুমেন্টে লক হয়ে যায়।
স্ট্যান্ডার্ড সংস্করণটি পেসিমিস্টিক কনকারেন্সি কন্ট্রোল ব্যবহার করে এবং ডেটাবেসের সাথে স্বল্প লেটেন্সি ও একটি নির্ভরযোগ্য সংযোগ ধরে নেয়।
ক্রমিক বিচ্ছিন্নতা
ট্রানজ্যাকশনগুলোর মধ্যে ডেটা বিরোধ ডাটাবেস আইসোলেশন লেভেলের সাথে ঘনিষ্ঠভাবে সম্পর্কিত। একটি ডাটাবেসের আইসোলেশন লেভেল বর্ণনা করে যে, সিস্টেমটি সমান্তরাল অপারেশনগুলোর মধ্যেকার দ্বন্দ্ব কতটা ভালোভাবে সামাল দেয়। নিম্নলিখিত ডাটাবেস প্রয়োজনীয়তাগুলো থেকে দ্বন্দ্বের সৃষ্টি হয়:
- লেনদেনের জন্য নির্ভুল ও সামঞ্জস্যপূর্ণ ডেটা প্রয়োজন।
- সম্পদের দক্ষ ব্যবহারের জন্য, ডেটাবেস অপারেশনগুলো যুগপৎভাবে সম্পাদন করে।
নিম্ন আইসোলেশন লেভেলের সিস্টেমে, একটি ট্রানজ্যাকশনের মধ্যেকার রিড অপারেশন সমান্তরাল কোনো অপারেশনের আনকমিটেড পরিবর্তনগুলো থেকে ভুল ডেটা রিড করতে পারে।
সিরিয়ালাইজেবল আইসোলেশন সর্বোচ্চ আইসোলেশন লেভেলকে সংজ্ঞায়িত করে। সিরিয়ালাইজেবল আইসোলেশন বলতে বোঝায় যে:
- আপনি ধরে নিতে পারেন যে ডাটাবেস ধারাবাহিকভাবে ট্রানজ্যাকশন সম্পাদন করে।
- সমান্তরাল অপারেশনে অপ্রতিশ্রুতিবদ্ধ পরিবর্তন দ্বারা লেনদেন প্রভাবিত হয় না।
ডাটাবেস যখন সমান্তরালভাবে একাধিক ট্রানজ্যাকশন সম্পাদন করে, তখনও এই নিশ্চয়তাটি অবশ্যই বজায় রাখতে হবে। এই নিশ্চয়তা ভঙ্গ করতে পারে এমন দ্বন্দ্ব নিরসনের জন্য ডাটাবেসকে অবশ্যই কনকারেন্সি কন্ট্রোল প্রয়োগ করতে হবে।
Cloud Firestore ট্রানজ্যাকশনের সিরিয়ালাইজেবল আইসোলেশন নিশ্চিত করে। Cloud Firestore ট্রানজ্যাকশনগুলো কমিট টাইমের মাধ্যমে সিরিয়ালাইজড এবং আইসোলেটেড হয়।
কমিট টাইম দ্বারা সিরিয়ালাইজেবল আইসোলেশন
Cloud Firestore প্রতিটি ট্রানজ্যাকশনকে একটি কমিট টাইম নির্ধারণ করে দেয়, যা একটি নির্দিষ্ট সময়কে নির্দেশ করে। যখন Cloud Firestore কোনো ট্রানজ্যাকশনের পরিবর্তনগুলো ডাটাবেসে কমিট করে, তখন আপনি ধরে নিতে পারেন যে ট্রানজ্যাকশনটির মধ্যেকার সমস্ত রিড এবং রাইট অপারেশন ঠিক সেই কমিট টাইমেই সম্পন্ন হয়।
একটি ট্রানজ্যাকশনের প্রকৃত সম্পাদনের জন্য কিছু সময় প্রয়োজন হয়। ট্রানজ্যাকশনের সম্পাদন কমিট টাইমের আগেই শুরু হয় এবং একাধিক অপারেশনের সম্পাদন একে অপরের সাথে ওভারল্যাপ করতে পারে। Cloud Firestore সিরিয়ালাইজেবল আইসোলেশন বজায় রাখে এবং এটি নিশ্চিত করে যে:
- Cloud Firestore কমিট করার সময় অনুসারে ট্রানজ্যাকশনগুলো ক্রমানুসারে কমিট করে।
- Cloud Firestore পরবর্তী কমিট টাইম সহ সমান্তরাল অপারেশনগুলো থেকে ট্রানজ্যাকশনগুলোকে আলাদা করে রাখে।
একই সাথে একাধিক অপারেশনের মধ্যে ডেটা নিয়ে বিরোধ দেখা দিলে, Cloud Firestore সেই বিরোধ নিরসন করতে অপটিমিস্টিক এবং পেসিমিস্টিক কনকারেন্সি কন্ট্রোল ব্যবহার করে।
একটি লেনদেনের মধ্যে বিচ্ছিন্নতা
একটি ট্রানজ্যাকশনের মধ্যে রাইট অপারেশনের ক্ষেত্রেও ট্রানজ্যাকশন আইসোলেশন প্রযোজ্য। একটি ট্রানজ্যাকশনের ভেতরের কোয়েরি এবং রিড অপারেশনগুলো সেই ট্রানজ্যাকশনের পূর্ববর্তী রাইট অপারেশনের ফলাফল দেখতে পায় না। এমনকি যদি আপনি একটি ট্রানজ্যাকশনের মধ্যে কোনো ডকুমেন্ট মডিফাই বা ডিলিটও করেন, সেই ট্রানজ্যাকশনের সমস্ত ডকুমেন্ট রিড অপারেশন কমিট করার সময়ের ভার্সনটিই রিটার্ন করে, যা ট্রানজ্যাকশনটির রাইট অপারেশনের আগের ভার্সন। যদি সেই সময়ে ডকুমেন্টটির অস্তিত্ব না থাকে, তাহলে রিড অপারেশনগুলো কিছুই রিটার্ন করে না।
ডেটা বিরোধ সংক্রান্ত সমস্যা
ডেটা বিরোধ এবং এর সমাধান সম্পর্কে আরও তথ্যের জন্য ট্রাবলশুটিং পৃষ্ঠাটি দেখুন।