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.