Sperren Datenbanken nach einer Abfrage oder Aktualisierung immer nicht vorhandene Zeilen?

Gegeben:

customer[id BIGINT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(30), count INT]

Ich möchte das folgende atomar ausführen: Aktualisieren Sie den Kunden, wenn er bereits existiert; Andernfalls fügen Sie einen neuen Kunden ein.

In der Theorie klingt dies wie eine perfekte Passform fürSQL-MERGE Die von mir verwendete Datenbank wird jedoch nicht unterstütztMERGE mit AUTO_INCREMENT-Spalten.

https://stackoverflow.com/a/1727788/14731 scheint darauf hinzudeuten, dass die Datenbank den Index sperrt, wenn Sie eine Abfrage- oder Aktualisierungsanweisung für eine nicht vorhandene Zeile ausführen, wodurch gleichzeitige Einfügungen verhindert werden.

Ist dieses Verhalten durch den SQL-Standard garantiert? Gibt es Datenbanken, die sich nicht so verhalten?

AKTUALISIEREN: Entschuldigung, ich hätte das früher erwähnen sollen: Die Lösung muss die Transaktionsisolation READ_COMMITTED verwendenes sei denn Das ist unmöglich. In diesem Fall akzeptiere ich die Verwendung von SERIALIZABLE.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage