SELECT FOR UPDATE
získá výhradní zámek záměru na stole před získáním výhradního zámku na záznamu.
Proto v tomto scénáři:
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`
dojde k uváznutí, protože obě transakce obsahují IX
uzamknout na stole a čekat na X
uzamknout záznamy.
Ve skutečnosti je tento scénář popsán v MySQL
manuál pro zamykání
.
Chcete-li to obejít, musíte se zbavit všech indexů kromě toho, na kterém hledáte, tedy lock_name
.
Stačí umístit primární klíč na id
.