Alternativa MySQL a la "mesa de bloqueo" en el procedimiento almacenado
-
26-10-2019 - |
Pregunta
Tengo el requisito de insertar una fila en una tabla si una fila aún no existe, y necesito hacerlo usando un procedimiento almacenado. Por lo tanto, necesito seleccionar para verificar si la fila ya existe, seguido de un inserto. Lo que quiero evitar es una condición de carrera en la que 2 personas que llaman del procedimiento almacenado pueden ver que la fila no existe y luego ambos intentan insertar la fila.
Mis primeros pensamientos sobre resolver esto sería bloquear la mesa, pero desafortunadamente no puedes emitir LOCK TABLE
en un procedimiento almacenado.
Quiero evitar atrapar una excepción de inserción de clave duplicada en el cliente (C#).
¿Alguna forma de bloquear la mesa o las soluciones alternativas?
Solución
puedes usar
insert into ... on duplicate key
Mira el ejemplo @Thummper Respuesta:
Otros consejos
Otra opción es usar
INSERT IGNORE INTO ...
Y siempre que tenga una clave única que sea violada por este inserto que ocurre dos veces, no se hará por segunda vez.