Mysql
 sql >> Base de données >  >> RDS >> Mysql

INSERT IGNORE verrouille-t-il la table même s'il ignore l'insertion ?

Cela dépend du moteur - MyIsam et InnoDb se comportent différemment.

Pour les tables MyIsam, si un enregistrement existe déjà dans la table (même s'il n'est pas encore validé), un INSERT régulier du même enregistrement ( la même clé unique) dans l'autre session signale une erreur de clé en double - donc INSERT IGNORE ignore simplement l'erreur et continue.

Sur la table InnoDB, si l'enregistrement n'est pas verrouillé, l'INSERT régulier sera immédiatement signaler l'erreur de clé en double (INSERT IGNORE ignorera l'erreur et continuera).
Mais si l'enregistrement est verrouillé par l'autre session (par exemple, l'enregistrement est inséré mais pas encore validé, ou l'enregistrement est verrouillé par un UPDATE ou DELETE ou SELECT FOR UPDATE), la commande INSERT "se bloquera" et attendra que l'autre session supprime le verrou (par COMMIT ou ROLLBACK). Ensuite, si l'enregistrement existe toujours après la suppression du verrou, INSERT signalera l'erreur (INSERT IGNORE ignorera l'erreur), mais si l'enregistrement n'existe pas, INSERT ajoutera cet enregistrement à la table.

Le mot-clé IGNORE dit simplement "en cas d'erreur, ignorez-le et continuez", mais cela n'affecte pas le comportement de verrouillage.