मुझे अपने क्लाइंट डिस्कनेक्ट होने के तुरंत बाद MySQL सर्वर को रोलबैक लेनदेन करने की आवश्यकता है, क्योंकि प्रत्येक क्लाइंट समवर्ती रूप से काम करता है। समस्या इस तरह reproduced किया जा सकता है
ग्राहक एक पर (एक InnoDB तालिका प्रकार का उपयोग):खोए/डिस्कनेक्ट किए गए कनेक्शन के साथ लेनदेन पर MySQL रोलबैक
START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... then disconnect your connection to the server
ग्राहक बी पर:
START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... lock wait time out will occur here
मैं निर्धारित किया था innodb_rollback_on_timeout
तरह MySQL के सर्वर विकल्प का उपयोग दोनों क्लाइंट पर mysql का क्लाइंट mysql --skip-reconnect
। मैंने नेटवर्क पर एक सर्वर और दो क्लाइंट का उपयोग करके इसे आजमाया। मैंने SELECT ... FOR UPDATE;
लाइन के बाद नेटवर्क को भौतिक रूप से (केबल को अनप्लग करें) डिस्कनेक्ट कर दिया। मुझे अन्य क्लाइंट को लेनदेन पर tblone
का उपयोग करने में सक्षम होना चाहिए (इसे लॉक करें, इसे अपडेट करें), और इसके लिए मुझे लगता है कि क्लाइंट ए डिस्कनेक्ट होने के बाद सर्वर को क्लाइंट ए के लेनदेन को रोलबैक करना चाहिए।
दिलचस्प सवाल। मैंने सोचा कि यह स्वचालित है! तो हमें 'innodb_rollback_on_disconnect' जैसी कुछ चाहिए .. यह बहुत अच्छा होगा और मैं कहूंगा, यह डिफ़ॉल्ट होना चाहिए! यह mysql के लिए उचित परिवर्तन अनुरोध होगा। – TMS