Pertama, kebuntuan tidak bergantung pada penguncian eksplisit. LOCK TABLE MySQL atau menggunakan mode isolasi transaksi non-default TIDAK diperlukan untuk menemui jalan buntu. Anda masih dapat mengalami kebuntuan jika Anda tidak pernah menggunakan transaksi eksplisit.
Kebuntuan dapat terjadi pada satu meja, cukup mudah. Paling sering itu dari satu meja panas.
Kebuntuan bisa genap terjadi jika semua transaksi Anda hanya melakukan penyisipan satu baris.
Kebuntuan dapat terjadi jika Anda memiliki
- Lebih dari satu koneksi ke database (jelas)
- Pengoperasian apa pun yang secara internal melibatkan lebih dari satu kunci.
Apa yang tidak jelas, adalah bahwa sebagian besar waktu, penyisipan atau pembaruan satu baris melibatkan lebih dari satu kunci. Alasannya adalah karena indeks sekunder juga perlu dikunci selama penyisipan/pembaruan.
SELECT tidak akan mengunci (dengan asumsi Anda menggunakan mode isolasi default, dan tidak menggunakan FOR UPDATE) jadi itu bukan penyebabnya.
SHOW ENGINE INNODB STATUS adalah teman Anda. Ini akan memberi Anda banyak informasi (diakui sangat membingungkan) tentang kebuntuan, khususnya, yang terbaru.
- Anda tidak dapat sepenuhnya menghilangkan kebuntuan, itu akan terus terjadi dalam produksi (bahkan pada sistem pengujian jika menekankannya dengan benar)
- Targetkan jumlah kebuntuan yang sangat rendah. Jika 1% dari transaksi Anda menemui jalan buntu, itu mungkin terlalu banyak.
- Pertimbangkan untuk mengubah tingkat isolasi transaksi dari transaksi Anda menjadi read-commit JIKA ANDA MEMAHAMI IMPLIKASI SEPENUHNYA
- pastikan perangkat lunak Anda menangani kebuntuan dengan tepat.