Itu benar. Baris dalam tabel yang sedang dibaca dikunci dengan kunci bersama (SELECT
secara implisit LOCK IN SHARE MODE
). Tidak ada cara untuk menghindari ini. Ini semacam apa yang Anda minta dari sistem:salin semua baris yang cocok dengan suatu kondisi. Satu-satunya cara untuk memastikan bahwa sebenarnya semua baris yang cocok dengan kondisi dan daftar itu tidak berubah selama atau segera setelah eksekusi pernyataan itu, adalah dengan mengunci baris.
Sebagai klarifikasi tentang mengapa Anda tidak dapat INSERT
dengan group_id = 2
:
Ini ada hubungannya dengan kueri Anda yang secara khusus WHERE group_id = 3 AND created < '2014-01-04'
pada KEY group_id_created (group_id, created)
. Untuk mencari semua baris yang cocok dengan group_id = 3 AND created < '2014-01-04'
indeks akan dilintasi mundur dimulai dari baris pertama yang melebihi kondisi batas atas tersebut, yaitu (3, '2014-01-14')
dan terus sampai menemukan baris yang tidak sesuai dengan kondisi, yang sejak created
tidak memiliki batas bawah akan menjadi baris pertama di mana group_id < 3
yang tentunya group_id = 2
.
Itu berarti baris pertama bertemu dengan group_id = 2
adalah juga terkunci, yang akan menjadi baris dengan maksimum created
nilai. Ini akan membuat tidak mungkin untuk INSERT
ke dalam "celah" antara (2, MAX(created))
dan (3, MIN(created))
(tentu saja bukan SQL yang tepat, hanya pseudo-SQL), meskipun ini bukan "kunci celah" secara khusus.