Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O INSERT IGNORE bloqueia a tabela mesmo que ignore a inserção?


Depende do mecanismo - MyIsam e InnoDb se comportam de forma diferente.

Para tabelas MyIsam, se um registro já existir na tabela (mesmo que ainda não tenha sido confirmado), um INSERT regular do mesmo registro ( a mesma chave exclusiva) na outra sessão relata um erro de chave duplicada - então INSERT IGNORE apenas ignora o erro e continua.

Na tabela InnoDB, se o registro não estiver bloqueado, o INSERT regular será imediatamente reporte o erro de chave duplicada (INSERT IGNORE irá pular o erro e continuar).
Mas se o registro estiver bloqueado pela outra sessão (por exemplo, o registro foi inserido mas não confirmado ainda, ou o registro está bloqueado por um comando UPDATE ou DELETE ou SELECT FOR UPDATE), o comando INSERT irá "travar" e ficará esperando até que a outra sessão remova o bloqueio (por COMMIT ou ROLLBACK). Então, se o registro ainda existir após a remoção do bloqueio, INSERT informará o erro (INSERT IGNORE ignorará o erro), mas se o registro não existir, INSERT adicionará esse registro à tabela.

A palavra-chave IGNORE apenas diz "no caso de qualquer erro, ignore-o e continue", mas não afeta o comportamento de bloqueio.