sql >> Databasteknik >  >> RDS >> Mysql

Låser INSERT IGNORE tabellen även om den ignorerar infogningen?

Det beror på motorn - MyIsam och InnoDb beter sig olika.

För MyIsam-tabeller, om en post redan finns i tabellen (även om den inte är commiterad ännu), en vanlig INSERT av samma post ( samma unika nyckel) i den andra sessionen rapporterar ett duplctate-nyckelfel - så INSERT IGNORE ignorerar bara felet och fortsätt vidare.

På InnoDB-tabellen, om posten inte är låst, kommer den vanliga INSERT omedelbart att rapportera dubblettnyckelfelet (INSERT IGNORE kommer att hoppa över felet och fortsätta).
Men om posten är låst av den andra sessionen (till exempel posten har infogats men inte commited ännu, eller posten är låst av en UPDATE eller DELETE eller SELECT FOR UPDATE-kommandot), kommer kommandot INSERT att "hänga" och väntar tills den andra sessionen tar bort låset (genom COMMIT eller ROLLBACK). Sedan, om posten fortfarande existerar efter att du tagit bort låset, kommer INSERT att rapportera felet (INSERT IGNORE ignorerar felet), men om posten inte finns kommer INSERT att lägga till denna post i tabellen.

IGNORE-nyckelordet säger bara "I händelse av något fel, ignorera det bara och fortsätt", men det påverkar inte låsbeteendet.




  1. Explicita JOINs vs implicita joins?

  2. Räkna Antal konsekutiv förekomst av värden i tabell

  3. Python3.4 kan inte installera mysql-python

  4. Jag vill visa flera bilder från databasen till jsp (jag mappar servlet) så i jsp kommer jag att visa i src av img-taggen