Mysql
 sql >> Database >  >> RDS >> Mysql

INSERT IGNORE blocca la tabella anche se ignora l'inserimento?

Dipende dal motore:MyIsam e InnoDb si comportano in modo diverso.

Per le tabelle MyIsam, se nella tabella esiste già un record (anche se non è stato ancora eseguito il commit), un normale INSERT dello stesso record ( la stessa chiave univoca) nell'altra sessione segnala un errore di chiave duplicata, quindi INSERT IGNORE ignora semplicemente l'errore e procede ulteriormente.

Nella tabella InnoDB, se il record non è bloccato, il normale INSERT verrà immediatamente segnala l'errore di chiave duplicata (INSERT IGNORE salterà l'errore e proseguirà).
Ma se il record è bloccato dall'altra sessione (ad esempio il record è inserito ma non ancora confermato, oppure il record è bloccato da un UPDATE o DELETE o SELECT FOR UPDATE), il comando INSERT si "bloccherà" e attenderà fino a quando l'altra sessione rimuoverà il blocco (mediante COMMIT o ROLLBACK). Quindi, se il record esiste ancora dopo aver rimosso il blocco, INSERT riporterà l'errore (INSERT IGNORE ignorerà l'errore), ma se il record non esiste, INSERT aggiungerà questo record alla tabella.

La parola chiave IGNORE dice semplicemente "in caso di errore, ignoralo e vai avanti", ma non influisce sul comportamento di blocco.