সারণী লক করা অন্য ডিবি ব্যবহারকারীদের আপনার সজ্জিত সারি / সারণীগুলিকে প্রভাবিত করতে বাধা দেয়। কিন্তু লকগুলি এবং তাদের মধ্যে, এটি নিশ্চিত করবে না যে আপনার যুক্তিটি একটি সামঞ্জস্যপূর্ণ অবস্থায় এসেছে।
একটি ব্যাংকিং সিস্টেমের কথা ভাবুন। আপনি যখন অনলাইনে বিল পরিশোধ করেন, লেনদেনের ফলে কমপক্ষে দুটি অ্যাকাউন্ট আক্রান্ত হয়: আপনার অ্যাকাউন্ট, যা থেকে অর্থ নেওয়া হয়। এবং প্রাপকের অ্যাকাউন্ট, যাতে অর্থ স্থানান্তরিত হয়। এবং ব্যাঙ্কের অ্যাকাউন্ট, যাতে তারা আনন্দের সাথে লেনদেনে চার্জ করা সমস্ত পরিষেবা ফি জমা করে দেবে। প্রদত্ত (যেহেতু সকলেই জানেন যে) ব্যাংকগুলি অসাধারণ বোকা, তাই বলি যে তাদের সিস্টেমটি এইভাবে কাজ করে:
$balance = "GET BALANCE FROM your ACCOUNT";
if ($balance < $amount_being_paid) {
charge_huge_overdraft_fees();
}
$balance = $balance - $amount_being paid;
UPDATE your ACCOUNT SET BALANCE = $balance;
$balance = "GET BALANCE FROM receiver ACCOUNT"
charge_insane_transaction_fee();
$balance = $balance + $amount_being_paid
UPDATE receiver ACCOUNT SET BALANCE = $balance
এখন, কোনও লক নেই এবং কোনও লেনদেন ছাড়াই, এই সিস্টেমটি বিভিন্ন বর্ণের অবস্থার জন্য ঝুঁকির মধ্যে রয়েছে, যার মধ্যে সবচেয়ে বড়টি হচ্ছে আপনার অ্যাকাউন্টে একাধিক অর্থ প্রদান করা হয়, বা সমান্তরালে গ্রহীতার অ্যাকাউন্টটি। আপনার কোডটিতে আপনার ভারসাম্য পুনরুদ্ধার করা হয়েছে এবং বিশাল_ওগ্রাফ্রাট_ফিজ () এবং কী করছেন না, এটি সম্পূর্ণভাবে সম্ভব যে অন্য কিছু অর্থ প্রদানের সমান্তরালে একই ধরণের কোড চলবে। তারা আপনার ভারসাম্য পুনরুদ্ধার করবে (বলুন, $ 100), তাদের লেনদেন করুন (আপনি যে 20 ডলার দিচ্ছেন এবং যে 30 ডলার আপনাকে দিয়ে দিচ্ছেন) তা বের করুন) এবং এখন উভয় কোড পাথের দুটি পৃথক ব্যালেন্স রয়েছে: $ 80 এবং $ 70। কোনটি শেষ হয় তার উপর নির্ভর করে, আপনার অ্যাকাউন্টে এই দুটি ব্যালেন্সের মধ্যে কোনওটি শেষ হবে, 50 এর পরিবর্তে আপনার উচিত হবে ($ 100 - $ 20 - $ 30)। এই ক্ষেত্রে, "আপনার পক্ষে ব্যাংক ত্রুটি"
এখন, ধরুন আপনি লক ব্যবহার করেন। আপনার বিলের অর্থ প্রদান (20 ডলার) প্রথমে পাইপটিকে আঘাত করে, সুতরাং এটি আপনার অ্যাকাউন্টের রেকর্ডটি জয় করে এবং লক করে। এখন আপনি একচেটিয়া ব্যবহার পেয়েছেন এবং ভারসাম্য থেকে ২০ ডলার কেটে নিতে পারবেন এবং নতুন ব্যালেন্সটি শান্তিতে আবার লিখতে পারবেন ... এবং আপনার অ্যাকাউন্টটি প্রত্যাশার সাথে $ 80 দিয়ে শেষ হবে। তবে ... আহো ... আপনি প্রাপকের অ্যাকাউন্ট আপডেট করার চেষ্টা করুন, এবং এটি লক হয়ে গেছে, এবং কোডের অনুমতি ছাড়াই লক হয়ে গেছে, আপনার লেনদেনের সময় নির্ধারণ করছে ... আমরা বোকা ব্যাংকগুলির সাথে ডিল করছি, তাই সঠিক ত্রুটির পরিবর্তে হ্যান্ডলিং, কোডটি কেবল একটি টানে exit()
এবং আপনার 20 ডলার ইলেক্ট্রনগুলির একটি ঘুষিতে পরিণত হয়। এখন আপনি 20 ডলার আউট করেছেন এবং এখনও আপনি রিসিভারের কাছে 20 ডলার andণী রয়েছেন এবং আপনার টেলিফোনটি পুনরায় জমা দেওয়া হবে।
সুতরাং ... লেনদেন প্রবেশ করুন আপনি একটি লেনদেন শুরু করেন, আপনি আপনার অ্যাকাউন্টে $ 20 ডেবিট করেন, আপনি রিসিভারকে $ 20 দিয়ে ক্রেডিট করার চেষ্টা করেন ... এবং আবার কিছু ফুটে উঠেছে। তবে এবার পরিবর্তে exit()
কোডটি কেবলমাত্র করতে পারে rollback
, এবং poof, আপনার $ 20 ম্যাজিকভাবে আপনার অ্যাকাউন্টে ফিরে যুক্ত হবে added
শেষ অবধি, এটি এখানে সিদ্ধ হয়:
লকগুলি আপনার সাথে যে কোনও ডাটাবেস রেকর্ডের সাথে হস্তক্ষেপ করা থেকে বিরত রাখে। লেনদেনগুলি আপনার "পূর্বে" জিনিসগুলিতে হস্তক্ষেপ থেকে কোনও "পরে" ত্রুটি রাখে। কোনও একাই গ্যারান্টি দিতে পারে না যে শেষ পর্যন্ত জিনিসগুলি ঠিক কাজ করে। তবে একসাথে তারা করে।
আগামীকালের পাঠে: ডেডলকের জয়।