मुझे आपके कोड में कोई स्पष्ट लेन-देन का दायरा नहीं दिख रहा है, इसलिए मुझे नहीं पता कि जब आप अपना अपडेट कर रहे हों तो कौन से ताले पहले से मौजूद हैं; यह भी स्पष्ट नहीं है कि आप किस अलगाव स्तर का उपयोग कर रहे हैं। लेकिन इस प्रकार की स्थिति में सबसे आम परिदृश्य यह है कि पहले उसी लेन-देन में आपने उन्हीं पंक्तियों पर एक चयन (रीड लॉक) जारी किया है जिसे आप बाद में अपडेट करने का प्रयास कर रहे हैं। यह एक लॉक एस्केलेशन का कारण होगा, और यदि दो लेन-देन एक ही काम करने की कोशिश कर रहे हैं, तो एक गतिरोध हो सकता है:
- लेन-देन ए:रीड लॉक के साथ चयन करें
- लेन-देन बी:रीडलॉक के साथ चयन करें
- लेन-देन ए:अपडेट - अपने रीड लॉक को एराइट लॉक में बढ़ाना चाहता है, लेकिन लेन-देन बी को अपना रीडलॉक जारी करने के लिए इंतजार करना पड़ता है
- लेन-देन बी:अपडेट - अपने रीड लॉक को एराइट लॉक में बढ़ाना चाहता है, लेकिन लेनदेन ए को अपना रीडलॉक जारी करने के लिए इंतजार करना पड़ता है।
बिंगो! गतिरोध के रूप में ए और बी दोनों अपने मौजूदा पठन लॉक को अपना अपडेट करने से पहले जारी करने के लिए एक-दूसरे की प्रतीक्षा कर रहे हैं।
इसे रोकने के लिए आपको अपने चयन में एक अपडेटलॉक संकेत की आवश्यकता है, उदा.,
select * from table with (updlock) where blah blah
यह सुनिश्चित करेगा कि आपका चयन रीड लॉक के बजाय राइट लॉक का उपयोग करता है, जो समवर्ती लेनदेन के बीच लॉक वृद्धि को रोकेगा।