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

PostgreSQL में गतिरोध का अनुकरण कैसे करें?

  1. दो कनेक्शन समानांतर में खोलें, जैसे psql . के दो इंस्टेंसेस या pgAdmin में दो क्वेरी विंडो (प्रत्येक का अपना सत्र है)।
  2. प्रत्येक कनेक्शन में लेनदेन प्रारंभ करें। BEGIN;
  3. परस्पर विरोधी आदेश बारी-बारी से चलाएँ।
  4. इससे पहले कि आप प्रतिबद्ध हों, दोनों में से एक को गतिरोध अपवाद के साथ वापस लाया जाएगा।
  5. आप दूसरे को वापस रोल करना चाह सकते हैं। ROLLBACK;

स्पष्ट रूप से लॉकिंग टेबल जितना आसान है:

LOCK tbl;

पंक्तियों को लॉक करना इसके साथ किया जा सकता है:

SELECT * FROM tbl WHERE boo = 3 FOR UPDATE;

या FOR SHARE आदि मैन्युअल में विवरण।
(या परोक्ष रूप से UPDATE . के साथ या DELETE ।)

उदाहरण

आपका जोड़ा उदाहरण गतिरोध नहीं कर सकता। दोनों पहले एक ही टेबल की एक ही पंक्ति पर एक ही ताला लेने की कोशिश करते हैं। दूसरा पहले के खत्म होने की प्रतीक्षा करेगा।

उदाहरण वास्तव में एक गतिरोध उत्पन्न करने के लिए (पंक्तियाँ मौजूद होनी चाहिए या कोई ताला नहीं लिया जाएगा):

Transaction 1                    Transaction 2
BEGIN;
                                 BEGIN;
SELECT salary1 
FROM   deadlock_demonstration
WHERE  worker_id = 1
FOR    UPDATE;
                                 SELECT salary1 
                                 FROM   deadlock_demonstration
                                 WHERE  worker_id = 2
                                 FOR    UPDATE;
UPDATE deadlock_demonstration
SET    salary1 = 100
WHERE  worker_id = 2;

                                 UPDATE deadlock_demonstration
                                 SET    salary1 = 100
                                 WHERE  worker_id = 1;

                    --> ... 💣 deadlock!

परिणाम

समाधान की पुष्टि के बाद OP user3388473 ने इस स्क्रीनशॉट का योगदान दिया:



  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. जेपीए के माध्यम से डेटाबेस तालिका में 'शून्य' मान डालने से बचें

  3. मूल्य सीमा द्वारा समूह

  4. उन पंक्तियों को खोजें जहाँ टेक्स्ट सरणी में इनपुट के समान मान होता है

  5. Postgresql एडेप्टर (pg):सर्वर से कनेक्ट नहीं हो सका