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