মডিউল পাঠ (2/4)
রেসের শর্ত
একটি একক টার্মিনালে একটি ডাটাবেস কীভাবে বিচ্ছিন্নভাবে কাজ করে তা বোঝা সহজ, তবে একটি বাস্তব ওয়েব পরিস্থিতিতে অনুরোধ পাঠানোর শত শত সমসাময়িক "নোড/পিএইচপি/গো" প্রক্রিয়া থাকবে। এখানেই বিখ্যাত রেস কন্ডিশনের জন্ম হয়।
"হারানো আপডেট" সমস্যা
হারিয়ে যাওয়া আপডেট ঘটে যখন দুটি থ্রেড একই পুরানো সারি পড়ে, জাভাস্ক্রিপ্ট সার্ভারে এটিতে কিছু গণিত করুন এবং ফলাফলটি সংরক্ষণ করতে আপডেটটি ফেরত পাঠান।
দৃশ্য:
- পণ্য #5 এর 10 ইউনিট রয়েছে।
- ব্যবহারকারী A একটি কিনেছে (সার্ভার A "10" পড়ে, "9" গণনা করে)।
- একই মিলিসেকেন্ডে ব্যবহারকারী B অন্য একটি ক্রয় করে A এর ক্রয় COMMIT পর্ব শেষ করার আগে।
- সার্ভার B "10"ও পড়ে, "9" গণনা করে।
- সার্ভার A
UPDATE: set quantity = 9পাঠায়। - সার্ভার B
UPDATE: set quantity = 9পাঠায়। - উভয়ই মনে করে যে তারা সফলভাবে সংখ্যা হ্রাস করেছে। কিন্তু চূড়ান্ত মান 8 ইউনিট হওয়া উচিত ছিল! একটি ফ্যান্টম ক্রয় হারিয়ে গেছে।
ভারী লেনদেন ছাড়া সমাধান (পরমাণু আপডেট)
বাইরে গণিত পড়া এবং করার পরিবর্তে, আপডেটের সময় এটি ডিবিকে করতে দিন, যা সর্বদা সিঙ্ক্রোনাইজ হয়।
-- Wrong
UPDATE products SET stock = 9 WHERE id = 5;
-- Correct and natively thread-safe
UPDATE products SET stock = stock - 1 WHERE id = 5;আরও চরম অসঙ্গতি (ডার্টি রিডস এবং ফ্যান্টম)
- ডার্টি রিড: আপনি অন্য কারোর অস্থায়ী ডেটা পড়েছেন যা এখনও একটি কমিট দ্বারা নিশ্চিত করা হয়নি (এবং হঠাৎ করে রোলব্যাকে যেতে পারে আপনাকে অবৈধ করে)।
- ফ্যান্টম রিডস: আপনি সমস্ত সারিগুলির একটি স্ক্যান করেন, এর মধ্যে একটি দ্বিতীয় থ্রেড একটি নতুন রেকর্ড সন্নিবেশ করে, তারপর আপনি একই লেনদেনের সময় আরেকটি স্ক্যান করেন এবং আপনি জাদুকরীভাবে দেখতে পান যে নতুন রেকর্ডটি কোথাও থেকে বেরিয়ে এসেছে, গণনাকৃত আর্থিক প্রতিবেদনে আপোস করে।
একটি ছোট স্ট্রিং ম্যানিপুলেশনের জন্য গ্রাহকদের রেকর্ড পরমাণুভাবে সংশোধন করুন।\nআসুন আমরা একটি তারকাচিহ্ন যোগ করতে একটি গ্রাহকের 'শহর' নাম পরিবর্তন করতে চাই। \nআইডি=10 এর জন্য সারির নিজস্ব মান ব্যবহার করে, ' - পুরানো'কে বর্তমান মানের সাথে সংযুক্ত করে এটি করুন (ব্যবহার করুন পোস্টগ্রেস' || কনক্যাটেনেশন পাইপ)।
ইঙ্গিত দেখান
আপডেট গ্রাহকদের সেট শহর = শহর || '- পুরাতন' যেখানে আইডি = 10;
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
অর্থপ্রদান এবং মূল্যের ক্ষেত্রে একটি ক্লাসিক হারানো আপডেট ঘটে।\n ধরা যাক একটি জরুরি মূল্য বৃদ্ধি হয়েছে: 'অর্ডার_আইটেম' টেবিলের 'ইউনিট_মূল্য' (অর্ডার 1 এর পণ্য 1-এর জন্য) 20% পারমাণবিকভাবে বৃদ্ধি করুন, অর্থাৎ JS-তে ম্যানুয়ালভাবে নতুন মূল্য ঢোকানোর পরিবর্তে এটিকে * 1.2 গুণ করুন।
ইঙ্গিত দেখান
অর্ডার_আইটেম আপডেট করুন ইউনিট_মূল্য = ইউনিট_মূল্য * 1.2 যেখানে অর্ডার_আইডি = 1 এবং পণ্য_আইডি = 1;
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ