Czy bazy danych zawsze blokują nieistniejące wiersze po zapytaniu lub aktualizacji?

Dany:

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

Chciałbym wykonać następujące polecenie atomowo: zaktualizuj klienta, jeśli już istnieje; w przeciwnym razie wstaw nowego klienta.

Teoretycznie brzmi to jak idealne dopasowaniePOŁĄCZENIE SQL ale baza danych, której używam, nie obsługujeMERGE z kolumnami AUTO_INCREMENT.

https://stackoverflow.com/a/1727788/14731 wydaje się wskazywać, że jeśli wykonasz zapytanie lub instrukcję aktualizacji w nieistniejącym wierszu, baza danych zablokuje indeks, zapobiegając tym samym jednoczesnym wstawieniom.

Czy to zachowanie jest gwarantowane przez standard SQL? Czy są jakieś bazy danych, które nie zachowują się w ten sposób?

AKTUALIZACJA: Przepraszam, powinienem był o tym wspomnieć wcześniej: rozwiązanie musi używać izolacji transakcji READ_COMMITTEDchyba że jest to niemożliwe, w takim przypadku zaakceptuję użycie SERIALIZABLE.

questionAnswers(4)

yourAnswerToTheQuestion