गतिरोध से निपटने का एक तरीका एक पुन:प्रयास तंत्र है जो एक यादृच्छिक अंतराल की प्रतीक्षा करता है और लेनदेन को फिर से चलाने का प्रयास करता है। यादृच्छिक अंतराल आवश्यक है ताकि टकराने वाले लेन-देन लगातार एक-दूसरे से टकराते न रहें, जिससे लाइव लॉक कहा जाता है - डिबग करने के लिए कुछ भी बुरा। वास्तव में अधिकांश जटिल अनुप्रयोगों को लेन-देन क्रमांकन विफलताओं को संभालने की आवश्यकता होने पर जल्दी या बाद में ऐसे पुन:प्रयास तंत्र की आवश्यकता होगी।
बेशक यदि आप गतिरोध के कारण को निर्धारित करने में सक्षम हैं तो आमतौर पर इसे समाप्त करना बेहतर होता है या यह होगा तुम्हें काटने के लिए वापस आओ। लगभग सभी मामलों के लिए, जब गतिरोध की स्थिति दुर्लभ होती है, तब भी थोड़ा सा थ्रूपुट और कोडिंग ओवरहेड लॉक को नियतात्मक क्रम में प्राप्त करने के लिए या अधिक मोटे अनाज वाले ताले प्राप्त करने के लिए इसके लायक है ताकि कभी-कभी बड़ी विलंबता हिट और अचानक प्रदर्शन चट्टान से बचा जा सके। समवर्ती स्केलिंग करते समय।
जब आप लगातार दो INSERT स्टेटमेंट प्राप्त कर रहे हैं, तो यह सबसे अधिक संभावना है कि यह एक अद्वितीय इंडेक्स इंसर्ट ऑर्डर इश्यू है। उदाहरण के लिए दो psql कमांड विंडो में निम्नलिखित का प्रयास करें:
Thread A | Thread B
BEGIN; | BEGIN;
| INSERT uniq=1;
INSERT uniq=2; |
| INSERT uniq=2;
| block waiting for thread A to commit or rollback, to
| see if this is an unique key error.
INSERT uniq=1; |
blocks waiting |
for thread B, |
DEADLOCK |
V
आमतौर पर इसे हल करने के लिए कार्रवाई का सबसे अच्छा तरीका मूल वस्तुओं का पता लगाना है जो ऐसे सभी लेनदेन की रक्षा करते हैं। अधिकांश अनुप्रयोगों में एक या दो प्राथमिक निकाय होते हैं, जैसे उपयोगकर्ता या खाते, जो इसके लिए अच्छे उम्मीदवार हैं। फिर आपको प्रत्येक लेनदेन के लिए प्राथमिक इकाई पर ताले प्राप्त करने के लिए चयन करें ... अद्यतन के लिए स्पर्श करें। या यदि कई को छूता है, तो उन सभी पर ताले लगवाएं लेकिन हर बार उसी क्रम में (प्राथमिक कुंजी द्वारा आदेश एक अच्छा विकल्प है)।