sql >> Databasteknik >  >> RDS >> Mysql

MySQL InnoDB dött lås på SELECT med exklusivt lås (FÖR UPPDATERING)

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 MySQL manual om låsning .

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 .



  1. Hur man skickar en nollvariabel till en lagrad SQL-procedur från C#.net-kod

  2. Använda MariaDB Audit Plugin för databassäkerhet

  3. Se om lat / long faller inom en polygon med mysql

  4. Flera MySQL-instanser på en enda maskin