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

kebuntuan postgresql

Ini adalah dua komentar yang disisipkan dengan content_id yang sama. Hanya dengan memasukkan komentar akan mengeluarkan kunci SHARE pada baris konten, untuk menghentikan transaksi lain yang menghapus baris tersebut hingga transaksi pertama selesai.

Namun, pemicu kemudian melanjutkan untuk meningkatkan kunci ke EKSKLUSIF, dan ini dapat diblokir oleh transaksi bersamaan yang melakukan proses yang sama. Perhatikan urutan kejadian berikut:

Txn 2754                      Txn 2053
Insert Comment
                              Insert Comment
Lock Content#935967 SHARE
  (performed by fkey)
                              Lock Content#935967 SHARE
                                (performed by fkey)
Trigger
Lock Content#935967 EXCLUSIVE
(blocks on 2053's share lock)
                              Trigger
                              Lock Content#935967 EXCLUSIVE
                              (blocks on 2754's share lock)

Jadi- kebuntuan.

Salah satu solusinya adalah segera ambil kunci eksklusif pada baris konten sebelum memasukkan komentar. yaitu

SELECT 1 FROM content WHERE content.id = 935967 FOR UPDATE
INSERT INTO comment(.....)

Solusi lain adalah menghindari pola "jumlah yang di-cache" ini sepenuhnya, kecuali jika Anda dapat membuktikan bahwa itu perlu untuk kinerja. Jika demikian, pertimbangkan untuk menyimpan jumlah yang di-cache di tempat lain selain tabel konten-- mis. meja khusus untuk konter. Itu juga akan mengurangi lalu lintas pembaruan ke tabel konten setiap kali komentar ditambahkan. Atau mungkin hanya memilih ulang hitungan dan menggunakan memcached di aplikasi. Tidak dapat dipungkiri bahwa di mana pun Anda menyimpan jumlah yang di-cache ini akan menjadi titik tersedak, itu harus diperbarui dengan aman.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemicu Postgres dan penguncian baris

  2. Penyediaan Sendiri Akun Pengguna di PostgreSQL melalui Akses Anonim Tanpa Hak

  3. Bagaimana cara mengaktifkan VERBOSITY PostgreSQL dalam koneksi Django db?

  4. Mencari substring di PostgreSQL

  5. Hubungan Satu-ke-Banyak di (Postgre)SQL