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