Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Sperrt INSERT IGNORE die Tabelle, auch wenn die Einfügung ignoriert wird?

Es hängt von der Engine ab - MyIsam und InnoDb verhalten sich unterschiedlich.

Für MyIsam-Tabellen, wenn ein Datensatz bereits in der Tabelle existiert (auch wenn er noch nicht festgeschrieben ist), wird ein reguläres INSERT desselben Datensatzes ( denselben eindeutigen Schlüssel) in der anderen Sitzung meldet einen doppelten Schlüsselfehler - also ignoriert INSERT IGNORE einfach den Fehler und fährt fort.

Wenn der Datensatz in der InnoDB-Tabelle nicht gesperrt ist, wird das reguläre INSERT sofort ausgeführt Melden Sie den doppelten Schlüsselfehler (INSERT IGNORE wird den Fehler überspringen und fortfahren).
Aber wenn der Datensatz von der anderen Sitzung gesperrt ist (zum Beispiel wurde der Datensatz eingefügt, aber noch nicht festgeschrieben, oder der Datensatz ist durch eine UPDATE- oder DELETE- oder SELECT FOR UPDATE-Befehl), wird der INSERT-Befehl "hängen" und warten, bis die andere Sitzung die Sperre entfernt (durch COMMIT oder ROLLBACK). Wenn der Datensatz nach dem Entfernen der Sperre noch vorhanden ist, meldet INSERT den Fehler (INSERT IGNORE ignoriert den Fehler), aber wenn der Datensatz nicht existiert, fügt INSERT diesen Datensatz zur Tabelle hinzu.

Das Schlüsselwort IGNORE sagt nur "im Falle eines Fehlers einfach ignorieren und weitermachen", aber es hat keinen Einfluss auf das Sperrverhalten.