¿Las bases de datos siempre bloquean filas no existentes después de una consulta o actualización?

Dado:

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

Me gustaría ejecutar lo siguiente de forma atómica: actualizar al cliente si ya existe; De lo contrario, inserte un nuevo cliente.

En teoría, esto suena como un ajuste perfecto paraSQL-MERGE pero la base de datos que estoy usando no es compatibleMERGE con columnas de AUTO_INCREMENT.

https://stackoverflow.com/a/1727788/14731 parece indicar que si ejecuta una consulta o una declaración de actualización contra una fila inexistente, la base de datos bloqueará el índice, impidiendo así inserciones concurrentes.

¿Está este comportamiento garantizado por el estándar SQL? ¿Existen bases de datos que no se comporten de esta manera?

ACTUALIZAR: Lo siento, debería haberlo mencionado anteriormente: la solución debe usar el aislamiento de transacción READ_COMMITTEDa no ser que eso es imposible en cuyo caso aceptaré el uso de SERIALIZABLE.

Respuestas a la pregunta(4)

Su respuesta a la pregunta