इस संबंधित प्रश्न से यह उछला , जहां मैं जानना चाहता था कि दो लेन-देन को कैसे एक तुच्छ मामले में क्रमिक रूप से होने के लिए मजबूर करना है (जहां दोनों केवल एक पंक्ति पर काम कर रहे हैं)। मुझे एक उत्तर मिला- SELECT ... FOR UPDATEदोनों लेन-देन की पहली पंक्ति के रूप में उपयोग करें - लेकिन इससे एक समस्या पैदा होती है: यदि पहला लेनदेन कभी भी प्रतिबद्ध या वापस नहीं हुआ है, तो दूसरा लेनदेन अनिश्चित काल के लिए अवरुद्ध हो जाएगा। innodb_lock_wait_timeoutचर सेकंड जिसके बाद ग्राहक दूसरी लेन-देन करने की कोशिश कर बताया जाएगा "क्षमा करें, पुन: प्रयास करें" ... लेकिन जहाँ तक मैं बता सकता हूँ, वे अगले सर्वर रिबूट तक फिर से प्रयास करने होगी की संख्या निर्धारित करता है। इसलिए:
- निश्चित रूप से
ROLLBACKयदि कोई लेन-देन हमेशा के लिए हो रहा है तो मजबूर करने का एक तरीका होना चाहिए ? क्या मुझे ऐसे लेनदेन को मारने के लिए डेमॉन का उपयोग करना चाहिए, और यदि ऐसा है, तो ऐसा डेमन कैसा दिखेगा? - यदि कोई कनेक्शन लेन-देन
wait_timeoutयाinteractive_timeoutमध्य लेन-देन द्वारा मारा जाता है , तो क्या लेनदेन वापस आ गया है? क्या कंसोल से इसका परीक्षण करने का कोई तरीका है?
क्लैरिफिकेशन : innodb_lock_wait_timeoutसेकंड की संख्या निर्धारित करता है जो एक लेन-देन ताला खोलने के लिए जारी होने का इंतजार करेगा; मैं जो चाहता हूं, वह ताला खोलने के लिए मजबूर करने का एक तरीका है ।
अपडेट 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इस परिदृश्य को रोकने के लिए कॉन्फ़िगरेशन क्यों नहीं है। क्योंकि यह क्लाइंट की गैर-जिम्मेदारी के कारण सर्वर हैंग करने के लिए स्वीकार्य नहीं है। मुझे आपके प्रश्न को समझने में कोई कठिनाई नहीं हुई यह भी बहुत प्रासंगिक है।