आपके दो कथन अलग-अलग क्रम में पंक्ति ताले प्राप्त करते हैं। गतिरोध के लिए यह एक क्लासिक मामला है। आप यह सुनिश्चित करके इसे ठीक कर सकते हैं कि लिए गए तालों का क्रम हमेशा कुछ वैश्विक क्रम में होता है (उदाहरण के लिए, आईडी द्वारा आदेशित)। आपको शायद दो UPDATE
को एक साथ रखना चाहिए एक में बयान और एसक्यूएल सर्वर पर भेजने से पहले क्लाइंट पर आईडी की सूची को सॉर्ट करें। कई विशिष्ट UPDATE
के लिए योजना यह वास्तव में ठीक काम करती है (हालांकि गारंटी नहीं है)।
या, यदि आप एक गतिरोध का पता लगाते हैं तो आप पुनः प्रयास तर्क जोड़ते हैं (SqlException.Number == 1205
) यह अधिक सुरुचिपूर्ण है क्योंकि इसके लिए किसी गहरे कोड परिवर्तन की आवश्यकता नहीं है। लेकिन गतिरोध का प्रदर्शन प्रभाव पड़ता है इसलिए ऐसा केवल कम गतिरोध दरों के लिए करें।
यदि आपकी समानांतर प्रक्रिया बहुत सारे अपडेट उत्पन्न करती है, तो आप INSERT
. कर सकते हैं उन सभी अद्यतनों को एक अस्थायी तालिका में (जो समवर्ती रूप से किया जा सकता है) और जब आप कर लेते हैं तो आप एक बड़ा UPDATE
निष्पादित करते हैं जो सभी व्यक्तिगत अपडेट रिकॉर्ड को मुख्य तालिका में कॉपी करता है। आप बस अपने नमूना प्रश्नों में शामिल होने के स्रोत को बदल दें।