SELECT FOR UPDATE
memperoleh kunci eksklusif maksud di atas meja sebelum mendapatkan kunci eksklusif pada catatan.
Oleh karena itu, dalam skenario ini:
X1: SELECT FOR UPDATE -- holds IX, holds X on 'lock_name'
X2: SELECT FOR UPDATE -- holds IX, waits for X on 'lock_name'
X1: INSERT -- holds IX, waits for X for the gap on `id`
kebuntuan terjadi, karena kedua transaksi memegang IX
mengunci meja dan menunggu X
mengunci catatan.
Sebenarnya, skenario ini dijelaskan dalam MySQL
manual tentang penguncian
.
Untuk mengatasinya, Anda harus menyingkirkan semua indeks kecuali yang Anda cari, yaitu lock_name
.
Cukup letakkan kunci utama di id
.