এটি এই সম্পর্কিত প্রশ্ন থেকে উদ্ভূত হয়েছে , যেখানে আমি জানতে চেয়েছিলাম যে কীভাবে একটি তুচ্ছ ঘটনাতে ক্রমশ দুটি সংযোগ স্থাপন করতে বাধ্য করা যায় (যেখানে উভয়ই কেবল একটি একক সারিতে কাজ করে)। আমি একটি উত্তর পেয়েছি - SELECT ... FOR UPDATE
উভয় লেনদেনের প্রথম লাইন হিসাবে ব্যবহার। তবে এটি একটি সমস্যার দিকে নিয়ে যায়: যদি প্রথম লেনদেনটি কখনই প্রতিশ্রুতিবদ্ধ বা ঘূর্ণিত না হয়, তবে দ্বিতীয় লেনদেনটি অনির্দিষ্টকালের জন্য অবরুদ্ধ করা হবে। innodb_lock_wait_timeout
পরিবর্তনশীল সেকেন্ড পরে যা ক্লায়েন্ট দ্বিতীয় লেনদেন করতে চেষ্টা বলা করা হবে "দুঃখিত, আবার চেষ্টা করুন" ... কিন্তু যতদূর আমি বলতে পারেন, তারা পরবর্তী সার্ভার রিবুট পর্যন্ত আবার চেষ্টা করতে চাই সংখ্যা সেট করে। তাই:
- অবশ্যই
ROLLBACK
কোনও লেনদেন চিরদিনের জন্য নিলে বাধ্য করার উপায় আছে ? আমি কি এই জাতীয় লেনদেনের জন্য ডেমন ব্যবহার করা উচিত এবং যদি তা হয় তবে এই জাতীয় ডেমন কেমন হবে? - যদি কোনও সংযোগ মেরে ফেলা হয়
wait_timeout
বাinteractive_timeout
মধ্য-লেনদেন হয়, তবে কি লেনদেনটি আবার ঘুরিয়ে দেওয়া হবে? কনসোল থেকে এটি পরীক্ষা করার কোনও উপায় আছে কি?
স্পেসিফিকেশন : ছাড়innodb_lock_wait_timeout
দেওয়ার আগে লক প্রকাশের জন্য লেনদেনের জন্য অপেক্ষা করা কয়েক সেকেন্ডের সংখ্যা নির্ধারণ করে; আমি যা চাই তা হ'ল লকটি মুক্তি দিতে বাধ্য করা way
আপডেট 1 : এখানে একটি সহজ উদাহরণ যা দেখায় innodb_lock_wait_timeout
যে দ্বিতীয় লেনদেনটি প্রথম দ্বারা অবরুদ্ধ নয় তা নিশ্চিত করার জন্য কেন পর্যাপ্ত নয়:
START TRANSACTION;
SELECT SLEEP(55);
COMMIT;
এর ডিফল্ট সেটিং সহ innodb_lock_wait_timeout = 50
, এই লেনদেনটি 55 সেকেন্ড পরে ত্রুটি ছাড়াই সম্পূর্ণ করে। এবং যদি আপনি লাইনের UPDATE
আগে একটি যুক্ত করেন SLEEP
, তবে SELECT ... FOR UPDATE
একই ক্লায়ার চেষ্টা করে এমন অন্য ক্লায়েন্টের কাছ থেকে দ্বিতীয় লেনদেন শুরু করুন , এটি দ্বিতীয় লেনদেনের সময় বেরিয়ে আসে, ঘুমিয়ে পড়ে না এমন নয়।
আমি যা খুঁজছি তা হ'ল এই লেনদেনের বিশ্রামহীন ঘুমের জোর বন্ধ করার উপায়।
আপডেট 2 : উপরের উদাহরণটি কতটা বাস্তবসম্মত, সে সম্পর্কে হোবডেভের উদ্বেগের জবাবে, এখানে একটি বিকল্প দৃশ্য রয়েছে: একটি ডিবিএ একটি লাইভ সার্ভারের সাথে সংযোগ স্থাপন করে চলে
START TRANSACTION
SELECT ... FOR UPDATE
যেখানে দ্বিতীয় লাইনটি একটি সারি লক করে যা অ্যাপ্লিকেশনটি প্রায়শই লিখে থাকে। তারপরে ডিবিএ বাধাগ্রস্ত হয় এবং লেনদেন শেষ করতে ভুলে চলে যায়। সারিটি আনলক না হওয়া পর্যন্ত অ্যাপ্লিকেশনটি একটি থামে গ্রাইন্ড হয়। এই ভুলের ফলস্বরূপ অ্যাপ্লিকেশনটি আটকে থাকার সময়টি আমি কমাতে চাই।
ROLLBACK
এটি n
সেকেন্ডের চেয়ে বেশি সময় নিলে আমি প্রথম লেনদেনের উপর জোর করতে চাই । এটি করার কোনও উপায় আছে?
MYSQL
এই পরিস্থিতি রোধ করার জন্য কোনও কনফিগারেশন নেই? কারণ ক্লায়েন্টদের দায়িত্বজ্ঞানের কারণে সার্ভার হ্যাং গ্রহণযোগ্য নয়। আপনার প্রশ্নটি বুঝতে আমি কোনও অসুবিধা পাইনি এটি এটিও প্রাসঙ্গিক।