এই পৃষ্ঠায় ট্রানজ্যাকশন সংক্রান্ত ডেটা কনটেনশন, সিরিয়ালাইজেবিলিটি ও আইসোলেশন সম্পর্কে বর্ণনা করা হয়েছে। ট্রানজ্যাকশন কোডের স্যাম্পেলের জন্য, এর পরিবর্তে ট্রানজ্যাকশন ও ব্যাচ করা রাইট দেখুন।
ট্রানজ্যাকশন ও ডেটা কন্টেনশন
কোনও ট্রানজ্যাকশন সফল হতে, এর রিড অপারেশনের মাধ্যমে পাওয়া ডকুমেন্ট ট্রানজ্যাকশনের বাইরের অপারেশন দ্বারা অবশ্যই অপরিবর্তিত থাকতে হবে। অন্য কোনও অপারেশন যদি সেইসব ডকুমেন্টের মধ্যে কোনও একটি পরিবর্তন করার চেষ্টা করে, তাহলে সেই অপারেশন ট্রানজ্যাকশনের সাথে ডেটা কনটেনশন স্টেটে প্রবেশ করে।
- ডেটা কন্টেনশন
- যখন দুই বা তার বেশি অপারেশন একই ডকুমেন্ট নিয়ন্ত্রণ করার জন্য প্রতিযোগিতা করে। যেমন, একটি ট্রানজ্যাকশনের জন্য কোনও ডকুমেন্টকে অপরিবর্তিত রাখার প্রয়োজন হতে পারে, যেখানে একই সময়ে অন্য একটি অপারেশন সেই ডকুমেন্টের ফিল্ড ভ্যালু আপডেট করার চেষ্টা করছে।
Cloud Firestore একটি অপারেশন বিলম্বিত বা ব্যর্থ করে ডেটা কন্টেনশন সমাধান করে। Cloud Firestore ক্লায়েন্ট লাইব্রেরি ডেটা কন্টেনশনের কারণে ব্যর্থ হওয়া ট্রানজ্যাকশন অটোমেটিক আবার চেষ্টা করে। নির্দিষ্ট সংখ্যক বার চেষ্টা করার পরে, ট্রানজ্যাকশন অপারেশন ব্যর্থ হয় এবং একটি ত্রুটি মেসেজ দেখায়:
ABORTED: Too much contention on these documents. Please try again.
কোন অপারেশনটি ব্যর্থ বা বিলম্বিত হবে তা সিদ্ধান্ত নেওয়ার সময়, আচরণটি কনকারেন্সি কন্ট্রোলের প্রকারের উপর নির্ভর করে।
কনকারেন্সি কন্ট্রোল
কনকারেন্সি মোড হল একটি কনফিগারযোগ্য ডেটাবেস বিকল্প। Cloud Firestore-এ নিম্নলিখিত কনকারেন্সি মোড কাজ করে:
PESSIMISTIC: পেসিমিস্টিক কনকারেন্সি কন্ট্রোল ধরে নেয় যে ডেটা কনটেনশন হওয়ার সম্ভাবনা আছে। অন্যান্য অপারেশন যাতে ডেটা পরিবর্তন করতে না পারে, তার জন্য পেসিমিস্টিক ট্রানজ্যাকশন ডেটাবেস লক ব্যবহার করে।পেসিমেস্টিক কনকারেন্সি কন্ট্রোলের মাধ্যমে, ট্রানজ্যাকশন যে ডকুমেন্ট পড়ে, সেটি লক করে দেয়। কোনও ডকুমেন্টে ট্রানজ্যাকশন লক করা থাকলে, অন্য ট্রানজ্যাকশন, ব্যাচ করা রাইট এবং নন-ট্রানজ্যাকশনাল রাইট সেই ডকুমেন্ট পরিবর্তন করতে পারে না। কমিট করার সময় ট্রানজ্যাকশন তার ডকুমেন্ট লক রিলিজ করে। এছাড়াও, এটি টাইম-আউট হলে বা কোনও কারণে ব্যর্থ হলে এর লক রিলিজ করে।
কোনও ট্রানজ্যাকশন কোনও ডকুমেন্ট লক করলে, অন্যান্য লেখার অপারেশনকে ট্রানজ্যাকশনটি তার লক রিলিজ করার জন্য অপেক্ষা করতে হবে। ট্রানজ্যাকশনগুলি কালানুক্রমিক ক্রমে তাদের লকগুলি অর্জন করে।
OPTIMISTIC: অপ্টিমিস্টিক কনকারেন্সি কন্ট্রোল ধরে নেয় যে ডেটা কনটেনশন হওয়ার সম্ভাবনা নেই অথবা ডেটাবেস লক করে রাখা কার্যকর নয়। অপ্টিমিস্টিক ট্রানজ্যাকশন ডেটা পরিবর্তন করা থেকে অন্যান্য অপারেশন ব্লক করার জন্য ডেটাবেস লক ব্যবহার করে নাঅপ্টিমিস্টিক কনকারেন্সি কন্ট্রোলের মাধ্যমে, ট্রানজ্যাকশন চলাকালীন আপনি যেসব ডকুমেন্ট পড়েন, ট্রানজ্যাকশন সেইসব ডকুমেন্টের ট্র্যাক রাখে। ট্রানজ্যাকশনটি তার লেখার কাজ সম্পূর্ণ করে শুধুমাত্র যদি ট্রানজ্যাকশনটি কার্যকর করার সময় সেই ডকুমেন্টগুলির কোনওটিই পরিবর্তিত না হয়। কোনও ডকুমেন্ট পরিবর্তন হলে, ট্রানজ্যাকশন হ্যান্ডলার ট্রানজ্যাকশনটি আবার করার চেষ্টা করে। কয়েকবার চেষ্টা করার পরেও ট্রানজ্যাকশনটি যদি কোনও পরিষ্কার ফলাফল না পায়, তাহলে ডেটা কন্টেনশনের কারণে ট্রানজ্যাকশনটি ব্যর্থ হয়।
কনকারেন্সি মোড ডিফল্ট
Standard সংস্করণের জন্য ডিফল্ট হল PESSIMISTIC। Enterprise এডিশনের জন্য
ডিফল্ট হল OPTIMISTIC। তবে, ক্লায়েন্ট লাইব্রেরির ধরনের উপরও
আচরণ নির্ভর করে:
- মোবাইল / ওয়েব SDK অপ্টিমিস্টিক কনকারেন্সি কন্ট্রোল ব্যবহার করে। মোবাইল ও ওয়েব SDK এই সেটিংয়ের থেকে স্বাধীনভাবে কাজ করে কারণ তারা সবসময় আশাবাদী কনকারেন্সি অনুকরণ করে।
- সার্ভার ক্লায়েন্ট লাইব্রেরি ডেটাবেস সেটিংয়ের কনকারেন্সি কন্ট্রোল ব্যবহার করে।
কনকারেন্সি মোড দেখুন
আপনার ডেটাবেসের সার্ভার-সাইড কনকারেন্সি মোড দেখতে
gcloud firestore databases describe
কমান্ড রান করুন:
gcloud firestore databases describe \
--project=PROJECT_ID \
--database=DATABASE_ID
কনকারেন্সি মোড পরিবর্তন করুন
আপনার ডেটাবেসের সার্ভার-সাইড কনকারেন্সি মোড পরিবর্তন করতে
gcloud firestore databases update
কমান্ড রান করুন:
gcloud firestore databases update \
--project=PROJECT_ID \
--database=DATABASE_ID \
--concurrency-mode=CONCURRENCY_MODE
কোথায়:
- CONCURRENCY_MODE হল
PESSIMISTICবাOPTIMISTIC। - PROJECT_ID হল আপনার Google Cloud প্রোজেক্টের আইডি।
- DATABASE_ID হল আপনার Cloud Firestore ডেটাবেসের আইডি।
মোবাইল/ওয়েব 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 বিরোধের সমাধান করতে আশাবাদী ও হতাশাবাদী কনকারেন্সি কন্ট্রোল ব্যবহার করে।
ট্রানজ্যাকশনের মধ্যে আইসোলেশন
ট্রানজ্যাকশন আইসোলেশন, ট্রানজ্যাকশনের মধ্যে রাইট অপারেশনের ক্ষেত্রেও প্রযোজ্য। কোনও ট্রানজ্যাকশনের মধ্যে কোয়েরি ও রিড অপারেশন সেই ট্রানজ্যাকশনের মধ্যে আগের রাইট অপারেশনের ফলাফল দেখতে পায় না। আপনি কোনও ট্রানজ্যাকশনের মধ্যে কোনও ডকুমেন্ট পরিবর্তন বা মুছে ফেললেও, সেই ট্রানজ্যাকশনের সমস্ত ডকুমেন্ট রিড, ট্রানজ্যাকশনের রাইট অপারেশনের আগে, কমিট করার সময় ডকুমেন্টের ভার্সন ফিরিয়ে দেয়। ডকুমেন্টটি তখন না থাকলে, রিড অপারেশন কিছুই ফেরত দেয় না।
ডেটা কন্টেনশন সংক্রান্ত সমস্যা
ডেটা কনটেনশন এবং কীভাবে তা সমাধান করবেন সেই সম্পর্কে আরও জানতে সমস্যার সমাধানকরণ পৃষ্ঠা দেখুন।