चलाते समय PostgreSQL में डेडलॉक्स मैं PostgreSQL deadlocks के बारे में थोड़ा उलझन में पढ़ रहा हूं।UPgATE
एक ठेठ गतिरोध उदाहरण है:
-- Transaction 1
UPDATE customer SET ... WHERE id = 1
UPDATE customer SET ... WHERE id = 2
-- Transaction 2
UPDATE customer SET ... WHERE id = 2
UPDATE customer SET ... WHERE id = 1
लेकिन क्या होगा अगर मैं कोड बदल इस प्रकार है:
-- Transaction 1
UPDATE customer SET ... WHERE id IN (1, 2)
-- Transaction 2
UPDATE customer SET ... WHERE id IN (1, 2)
गतिरोध यहाँ की संभावना हो जाएगा?
अनिवार्य रूप से मेरा प्रश्न है: दूसरे मामले में PostgreSQL लॉक पंक्तियों को एक-एक करके करता है, या पूरे स्कोप को WHERE
स्थिति से ढंकता है?
अग्रिम धन्यवाद!
धन्यवाद! तो मेरा उदाहरण उपरोक्त कारण बन सकता है (क्योंकि हम आदेश को नहीं जानते हैं, जिसमें पंक्तियों को दोनों लेनदेन में संसाधित किया जाता है)? – vyakhir
यह एक डेडलॉक का कारण बन सकता है, हालांकि यह दुर्लभ होगा; पहले उदाहरण के विपरीत (स्पष्ट रूप से विभिन्न आदेशों का चयन), जहां यह आम होगा। आप तालिका को अपडेट करने वाले प्रत्येक लेनदेन की अवधि के लिए उचित ताकत का टेबल-स्तरीय लॉक लेकर डेडलॉक्स को रद्द कर सकते हैं, लेकिन यह इलाज बीमारी से भी बदतर हो सकता है। विवरण के लिए संदर्भित दस्तावेज़ अनुभाग देखें। – kgrittn
लेकिन पंक्ति अद्यतन होने के बाद PostgreSQL रिलीज लॉक करता है, लेकिन पूरा अद्यतन विवरण अभी तक समाप्त नहीं हुआ है? दूसरे शब्दों में यदि हमारे पास अपडेट का विवरण है ... जहां आईडी (1,2,3,4,5) पोस्टग्रेस्क्ल अपडेट के बाद, कहें, id = 1 के साथ पंक्ति और आईडी के साथ पंक्ति के साथ आय = 2, क्या यह पंक्ति आईडी = 1 जारी करेगा? यदि हां, तो जरूरी होने पर पंक्तियों को कैसे वापस लाया जाएगा? – vyakhir