PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara mensimulasikan kebuntuan di PostgreSQL?

  1. Buka dua koneksi secara paralel, seperti dua instance psql atau dua jendela kueri di pgAdmin (masing-masing memiliki sesinya sendiri).
  2. Mulai transaksi di setiap koneksi. BEGIN;
  3. Jalankan perintah yang saling bertentangan secara bergantian.
  4. Sebelum Anda dapat melakukan, salah satu dari keduanya akan dibatalkan dengan pengecualian kebuntuan.
  5. 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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Biaya publisitas PostgreSQL gratis

  2. Simpan dan indeks YAML dengan PostgreSQL, dengan Javascript lib atau fungsi yang dapat digunakan kembali?

  3. Bagaimana cara menghapus tampilan tabel * atau * dari database PostgreSQL?

  4. cara menyimpan objek serial dengan namespace di database menggunakan pdo php

  5. Array awal berfungsi untuk menggabungkan array multi-dimensi