आदेशित उपश्रेणियों में स्पष्ट पंक्ति-स्तरीय लॉकिंग का उपयोग करें सभी प्रतिस्पर्धी प्रश्नों में .
(SELECT
राइट-लॉक के साथ प्रतिस्पर्धा नहीं करता है।)
DELETE
DELETE FROM table_name t
USING (
SELECT id_A, id_B
FROM table_name
WHERE id_A = ANY(array_of_id_A)
AND id_B = ANY(array_of_id_B)
ORDER BY id_A, id_B
FOR UPDATE
) del
WHERE t.id_A = del.id_A
AND t.id_B = del.id_B;
UPDATE
UPDATE table_name t
SET val_1 = 'some value'
, val_2 = 'some value'
FROM (
SELECT id_A, id_B
FROM table_name
WHERE id_A = ANY(array_of_id_A)
AND id_B = ANY(array_of_id_B)
ORDER BY id_A, id_B
FOR NO KEY UPDATE -- Postgres 9.3+
-- FOR UPDATE -- for older versions or updates on key columns
) upd
WHERE t.id_A = upd.id_A
AND t.id_B = upd.id_B;
इस तरह, मैनुअल में सलाह के अनुसार पंक्तियों को लगातार क्रम में लॉक किया जाता है।
मान लें कि id_A
, id_B
कभी भी अपडेट नहीं किया जाता है, यहां तक कि दुर्लभ कॉर्नर केस जटिलताएं भी संभव नहीं हैं, जैसे कि मैनुअल में "सावधानी" बॉक्स में विस्तृत विवरण संभव नहीं है।
कुंजी कॉलम अपडेट नहीं करते समय, आप कमजोर लॉक मोड का उपयोग कर सकते हैं FOR NO KEY UPDATE
. पोस्टग्रेज 9.3 या बाद के संस्करण की आवश्यकता है।
दूसरा (धीमा और सुनिश्चित करें) विकल्प प्रतिस्पर्धी लेनदेन के लिए क्रमिक अलगाव स्तर का उपयोग करना है। आपको क्रमांकन विफलताओं के लिए तैयार रहना होगा, इस स्थिति में आपको आदेश को पुनः प्रयास करना होगा।