No creo que su pregunta sea realmente independiente de la base de datos. La respuesta correcta podría depender de los detalles de implementación, que pueden variar de un proveedor a otro y cambiar con la próxima versión. Probaría bajo concurrencia antes de elegir cualquier enfoque en cualquier RDBMS.
En este momento, en SQL Server 2008 R2, estoy usando lo siguiente:
Baja concurrencia y baja cantidad de modificaciones. Para guardar una sola fila, serializo usando sp_getapplock y uso MERGE. Pruebo de estrés bajo alta concurrencia para verificar que funcione.
Mayor concurrencia y / o volumen. Para evitar la concurrencia y aumentar el rendimiento, no guardo una fila a la vez. Acumulo cambios en mi servidor de aplicaciones y uso TVP para guardar lotes. Aún así, para evitar problemas relacionados con la concurrencia, serializo usando sp_getapplock antes de MERGE. Una vez más, hago una prueba de estrés bajo alta concurrencia para verificar que funcione.
Como resultado, tenemos un buen rendimiento y cero problemas relacionados con la concurrencia en la producción: sin puntos muertos, sin PK / violaciones de restricciones únicas, etc.