एक गतिरोध त्रुटि देता है 1213
जिसे आपको क्लाइंट साइड पर प्रोसेस करना चाहिए
ध्यान दें कि गतिरोध और लॉक प्रतीक्षा अलग-अलग चीजें हैं। गतिरोध में, कोई "विफल" लेनदेन नहीं है:वे दोनों दोषी हैं। इस बात की कोई गारंटी नहीं है कि किसे वापस लाया जाएगा।
इस तरह के परिदृश्य में गतिरोध उत्पन्न होता है:
UPDATE t_first -- transacion 1 locks t_first
SET id = 1;
UPDATE t_second -- transaction 2 locks t_second
SET id = 2;
UPDATE t_second -- transaction 1 waits for transaction 2 to release the lock on t_second
SET id = 2;
UPDATE t_first -- transaction 2 waits for transaction 1 to release the lock on t_first. DEADLOCK
SET id = 2;
क्या आप वाकई लॉक प्रतीक्षा के साथ इसे भ्रमित नहीं कर रहे हैं?
लॉक प्रतीक्षा तब होती है जब कोई लेन-देन किसी अन्य लेन-देन द्वारा पहले से लॉक किए गए संसाधन को लॉक करने का प्रयास करता है।
ऊपर के उदाहरण में चरण 3
. पर लॉक प्रतीक्षा होती है ।
चूंकि यह एक सामान्य स्थिति है (एक गतिरोध के विपरीत), जिसे लॉक रखने वाले लेन-देन को कम करके या वापस रोल करके बाहर से हल किया जा सकता है, InnoDB
लॉक रखने वाले लेनदेन को रोलबैक करने का प्रयास नहीं करेगा।
इसके बजाय, यह केवल उस कथन को रद्द कर देगा जिसने टाइमआउट होने के बाद लॉक प्राप्त करने का प्रयास किया था।
डिफ़ॉल्ट रूप से समयबाह्य 50
. है सेकंड और innodb_lock_wait_timeoutका उपयोग करके सेट किया गया है। कोड>
।
विफल कथन (वह जो अधिग्रहण . करने का प्रयास करता है लॉक) त्रुटि लौटाएगा 1205
।