sql >> Database >  >> RDS >> Mysql

Vergrendelt INSERT IGNORE de tafel, zelfs als het de insert negeert?

Het hangt af van de engine - MyIsam en InnoDb gedragen zich anders.

Voor MyIsam-tabellen, als een record al in de tabel bestaat (zelfs als het nog niet is vastgelegd), een normale INSERT van hetzelfde record ( dezelfde unieke sleutel) in de andere sessie rapporteert een dubbele sleutelfout - dus INSERT IGNORE negeert de fout en gaat verder.

In de InnoDB-tabel, als het record niet is vergrendeld, zal de normale INSERT onmiddellijk rapporteer de dubbele sleutelfout (INSERT IGNORE slaat de fout over en gaat verder).
Maar als het record is vergrendeld door de andere sessie (bijvoorbeeld het record is ingevoegd maar nog niet vastgelegd, of het record is vergrendeld door een UPDATE of DELETE of SELECT FOR UPDATE commando), zal het INSERT commando "vastlopen" en wachten tot de andere sessie de vergrendeling opheft (door COMMIT of ROLLBACK). Als het record dan nog steeds bestaat na het verwijderen van de vergrendeling, zal INSERT de fout rapporteren (INSERT IGNORE negeert de fout), maar als het record niet bestaat, zal INSERT dit record aan de tabel toevoegen.

IGNORE-trefwoord zegt gewoon "in geval van een fout negeer het gewoon en ga door", maar het heeft geen invloed op het sluitgedrag.




  1. zsh:opdracht niet gevonden:mysql

  2. Beperken met voorwaardelijke waardecontrole in MySQL

  3. Zal een SQL Server-taak een geplande uitvoering overslaan als deze al actief is?

  4. gem install pg werkt niet op OSX Lion