Dari ketergantungan pada pengaturan nilai kolom yang diindeks lebih tinggi atau lebih rendah, sepertinya kunci benar-benar ditempatkan pada entri indeks. Mesin basis data memindai indeks, dan berhenti pada entri terkunci pertama, menunggu untuk dirilis.
Ketika transaksi pertama dilakukan, indeks dibuka, dan transaksi menunggu melanjutkan pemindaian indeks. Karena nilainya diturunkan, sekarang lebih awal di indeks. Jadi pemindaian yang dilanjutkan tidak melihatnya karena telah melewati titik tersebut.
Untuk mengkonfirmasi ini, coba tes berikut:
- Buat dua baris, dengan nilai 2 dan 3.
- Pada kedua transaksi, lakukan
SELECT ... FOR UPDATE
- Pada transaksi 1, ubah 2 menjadi 1, 3 menjadi 4.
- Melakukan transaksi 1.
Jika tebakan saya benar, transaksi 2 seharusnya hanya mengembalikan baris dengan 4.
Ini tampak seperti bug bagi saya, karena saya tidak berpikir Anda seharusnya mendapatkan hasil parsial seperti ini. Sayangnya, sulit untuk mencari ini di bugs.mysql.com, karena kata "untuk" diabaikan saat mencari karena terlalu pendek atau umum. Bahkan mengutip "untuk pembaruan" tampaknya tidak menemukan bug yang hanya berisi frasa ini.