- दो कनेक्शन समानांतर में खोलें, जैसे
psql
. के दो इंस्टेंसेस या pgAdmin में दो क्वेरी विंडो (प्रत्येक का अपना सत्र है)। - प्रत्येक कनेक्शन में लेनदेन प्रारंभ करें।
BEGIN;
- परस्पर विरोधी आदेश बारी-बारी से चलाएँ।
- इससे पहले कि आप प्रतिबद्ध हों, दोनों में से एक को गतिरोध अपवाद के साथ वापस लाया जाएगा।
- आप दूसरे को वापस रोल करना चाह सकते हैं।
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 ने इस स्क्रीनशॉट का योगदान दिया: