- Buka dua koneksi secara paralel, seperti dua instance
psql
atau dua jendela kueri di pgAdmin (masing-masing memiliki sesinya sendiri). - Mulai transaksi di setiap koneksi.
BEGIN;
- Jalankan perintah yang saling bertentangan secara bergantian.
- Sebelum Anda dapat melakukan, salah satu dari keduanya akan dibatalkan dengan pengecualian kebuntuan.
- Anda mungkin ingin memutar kembali yang lain.
ROLLBACK;
Secara eksplisit mengunci tabel sesederhana:
LOCK tbl;
Mengunci baris dapat dilakukan dengan:
SELECT * FROM tbl WHERE boo = 3 FOR UPDATE;
Atau FOR SHARE
dll. Rincian dalam manual.
(Atau secara implisit dengan UPDATE
atau DELETE
.)
Contoh
Contoh Anda yang ditambahkan tidak dapat menemui jalan buntu. Keduanya mencoba mengambil kunci yang sama pada baris yang sama dari tabel yang sama terlebih dahulu. Yang kedua akan menunggu yang pertama selesai.
Contoh untuk benar-benar menghasilkan kebuntuan (baris harus ada atau tidak ada kunci yang akan diambil):
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!
Hasil
Pengguna OP3388473 menyumbangkan tangkapan layar ini setelah memverifikasi solusinya: