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.