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

बल्क अपडेट और डिलीट ऑपरेशन करते समय PostgreSQL गतिरोध से बचना

आदेशित उपश्रेणियों में स्पष्ट पंक्ति-स्तरीय लॉकिंग का उपयोग करें सभी प्रतिस्पर्धी प्रश्नों में .
(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 या बाद के संस्करण की आवश्यकता है।

दूसरा (धीमा और सुनिश्चित करें) विकल्प प्रतिस्पर्धी लेनदेन के लिए क्रमिक अलगाव स्तर का उपयोग करना है। आपको क्रमांकन विफलताओं के लिए तैयार रहना होगा, इस स्थिति में आपको आदेश को पुनः प्रयास करना होगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. इनपुट मापदंडों की चर संख्या के साथ कार्य

  2. PostgreSQL DigitalOcean प्रदर्शन और मूल्य निर्धारण की तुलना - स्केलग्रिड बनाम DigitalOcean प्रबंधित डेटाबेस

  3. आयात त्रुटि क्या है:प्रतीक नहीं मिला:_PQencryptPasswordConn का अर्थ है और मैं इसे कैसे ठीक करूं?

  4. PostgreSQL 12 में प्रगति रिपोर्टिंग संवर्द्धन

  5. प्रोग्रामेटिक रूप से पोस्टग्रेज JDBC के लिए एक `डेटासोर्स` ऑब्जेक्ट तैयार करें