Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर 2005 और C# एप्लिकेशन में गतिरोध से कैसे छुटकारा पाएं?

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

  1. लेन-देन ए:रीड लॉक के साथ चयन करें
  2. लेन-देन बी:​​रीडलॉक के साथ चयन करें
  3. लेन-देन ए:अपडेट - अपने रीड लॉक को एराइट लॉक में बढ़ाना चाहता है, लेकिन लेन-देन बी को अपना रीडलॉक जारी करने के लिए इंतजार करना पड़ता है
  4. लेन-देन बी:​​अपडेट - अपने रीड लॉक को एराइट लॉक में बढ़ाना चाहता है, लेकिन लेनदेन ए को अपना रीडलॉक जारी करने के लिए इंतजार करना पड़ता है।

बिंगो! गतिरोध के रूप में ए और बी दोनों अपने मौजूदा पठन लॉक को अपना अपडेट करने से पहले जारी करने के लिए एक-दूसरे की प्रतीक्षा कर रहे हैं।

इसे रोकने के लिए आपको अपने चयन में एक अपडेटलॉक संकेत की आवश्यकता है, उदा.,

select * from table with (updlock) where blah blah

यह सुनिश्चित करेगा कि आपका चयन रीड लॉक के बजाय राइट लॉक का उपयोग करता है, जो समवर्ती लेनदेन के बीच लॉक वृद्धि को रोकेगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में मैं एक ऑटो-इन्क्रीमेंट प्राथमिक कुंजी आईडी कैसे उत्पन्न करूं जिसमें वर्ष, एक विशेष चार और एक अनुक्रमिक श्रृंखला संख्या शामिल हो?

  2. जावा हाइबरनेट और एसक्यूएल सर्वर में यूयूआईडी के विभिन्न प्रतिनिधित्व

  3. डेटा के सबसेट के लिए स्क्रिप्ट तैयार करना

  4. एंटिटी फ्रेमवर्क कोड पहले - टेबल कॉलम कोलाज बदलें

  5. जांचें कि क्या कोई पंक्ति मौजूद है, अन्यथा डालें