VÄLJ FÖR UPPDATERING
erhåller ett exklusivt avsiktslås på bordet innan det exklusiva låset på posten erhålls.
Därför, i det här scenariot:
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`
ett dödläge uppstår eftersom båda transaktionerna innehåller en IX
lås på bordet och väntar på ett X
lås på journalerna.
I själva verket beskrivs just detta scenario i
För att komma runt detta måste du bli av med alla index förutom det du söker på, det vill säga lock_name
.
Släpp bara primärnyckeln på id
.