এই পৃষ্ঠাটি লেনদেন সংক্রান্ত ডেটা বিবাদ, ধারাবাহিকতা এবং বিচ্ছিন্নতা বর্ণনা করে। লেনদেন কোড নমুনার জন্য, পরিবর্তে লেনদেন এবং ব্যাচ করা লেখা দেখুন।
লেনদেন এবং তথ্য বিতর্ক
একটি লেনদেন সফল হওয়ার জন্য, এর পঠিত ক্রিয়াকলাপগুলির দ্বারা পুনরুদ্ধার করা নথিগুলিকে লেনদেনের বাইরের ক্রিয়াকলাপগুলির দ্বারা অপরিবর্তিত থাকতে হবে৷ যদি অন্য একটি ক্রিয়াকলাপ সেই নথিগুলির একটি পরিবর্তন করার চেষ্টা করে, সেই অপারেশনগুলি লেনদেনের সাথে ডেটা বিতর্কের একটি অবস্থায় প্রবেশ করে।
- ডেটা বিতর্ক
- যখন দুই বা ততোধিক অপারেশন একই নথি নিয়ন্ত্রণ করতে প্রতিযোগিতা করে। উদাহরণস্বরূপ, একটি লেনদেনের জন্য একটি দস্তাবেজ সামঞ্জস্যপূর্ণ থাকার প্রয়োজন হতে পারে যখন একটি সমকালীন অপারেশন সেই নথির ক্ষেত্রের মানগুলি আপডেট করার চেষ্টা করে।
Cloud Firestore কোনো একটি ক্রিয়াকলাপকে বিলম্বিত বা ব্যর্থ করে ডেটা বিতর্কের সমাধান করে। Cloud Firestore ক্লায়েন্ট লাইব্রেরিগুলি স্বয়ংক্রিয়ভাবে লেনদেনগুলি পুনরায় চেষ্টা করে যা ডেটা বিতর্কের কারণে ব্যর্থ হয়৷ সীমিত সংখ্যক পুনঃপ্রচেষ্টার পর, লেনদেন অপারেশন ব্যর্থ হয় এবং একটি ত্রুটি বার্তা ফেরত দেয়:
ABORTED: Too much contention on these documents. Please try again.
কোন অপারেশনটি ব্যর্থ হবে বা বিলম্ব করবে তা সিদ্ধান্ত নেওয়ার সময়, আচরণ ক্লায়েন্ট লাইব্রেরির প্রকারের উপর নির্ভর করে।
মোবাইল/ওয়েব SDK গুলি আশাবাদী সমসাময়িক নিয়ন্ত্রণ ব্যবহার করে৷
সার্ভার ক্লায়েন্ট লাইব্রেরিগুলি হতাশাবাদী সমবায় নিয়ন্ত্রণ ব্যবহার করে।
মোবাইল/ওয়েব SDK-এ ডেটা বিতর্ক
মোবাইল/ওয়েব SDKs (অ্যাপল প্ল্যাটফর্ম, অ্যান্ড্রয়েড, ওয়েব, সি++) ডেটা বিতর্কের সমাধান করার জন্য আশাবাদী সমসাময়িক নিয়ন্ত্রণ ব্যবহার করে।
- আশাবাদী সঙ্গতি নিয়ন্ত্রণ
- এই ধারণার উপর ভিত্তি করে যে ডেটা বিতর্কের সম্ভাবনা নেই বা এটি ডাটাবেস লক রাখা দক্ষ নয়। আশাবাদী লেনদেন ডেটা পরিবর্তন থেকে অন্যান্য অন্যান্য ক্রিয়াকলাপগুলিকে ব্লক করতে ডাটাবেস লক ব্যবহার করে না।
মোবাইল/ওয়েব SDK গুলি আশাবাদী সমসাময়িক নিয়ন্ত্রণগুলি ব্যবহার করে, কারণ তারা উচ্চ লেটেন্সি এবং একটি অবিশ্বস্ত নেটওয়ার্ক সংযোগ সহ পরিবেশে কাজ করতে পারে৷ একটি উচ্চ লেটেন্সি পরিবেশে নথি লক করা অনেকগুলি ডেটা বিতর্ক ব্যর্থতার কারণ হবে৷
মোবাইল/ওয়েব 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 বিরোধ সমাধানের জন্য আশাবাদী এবং হতাশাবাদী সমসাময়িক নিয়ন্ত্রণগুলি ব্যবহার করে।
একটি লেনদেনের মধ্যে বিচ্ছিন্নতা
লেনদেন বিচ্ছিন্নতা একটি লেনদেনের মধ্যে অপারেশন লেখার ক্ষেত্রেও প্রযোজ্য। একটি লেনদেনের ভিতরে প্রশ্ন এবং পড়া সেই লেনদেনের ভিতরে আগের লেখার ফলাফল দেখতে পায় না। এমনকি যদি আপনি একটি লেনদেনের মধ্যে একটি নথি সংশোধন বা মুছে ফেলেন, লেনদেনের লেখার ক্রিয়াকলাপগুলির আগে, সেই লেনদেনে পড়া সমস্ত নথি প্রতিশ্রুতিবদ্ধ সময়ে নথির সংস্করণটি ফেরত দেয়৷ নথিটি তখন বিদ্যমান না থাকলে রিড অপারেশন কিছুই ফেরত দেয় না।
তথ্য বিতর্ক সঙ্গে সমস্যা
ডেটা বিতর্ক এবং কীভাবে সেগুলি সমাধান করা যায় সে সম্পর্কে আরও তথ্যের জন্য সমস্যা সমাধানের পৃষ্ঠাটি দেখুন।