¿Debo bloquear una tabla ISAM para insertar un valor en un campo clave único?

StackOverflow https://stackoverflow.com/questions/169459

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo una tabla ISAm en mySql que se creó de forma similar a esta:

create table mytable (
 id int not null auto_increment primary key,
 name varchar(64) not null );

create unique index nameIndex on mytable (name);

Tengo varios procesos que insertan filas en esta tabla. Si dos procesos intentan insertar el mismo " nombre " ;, quiero asegurarme de que uno de ellos reciba un error o encuentre la fila con el " nombre " coincidente.

Debería bloquear la tabla y, en el bloqueo, asegurarme de que el nombre no existe, o debo confiar en que el servidor dé un error a uno de los procesos que intentan insertar un valor que ya existe en el índice único. campo?

Dudo un poco en usar un candado porque no quiero entrar en una situación de bloqueo.

¿Fue útil?

Solución

No te molestes en bloquear, tu índice evitará duplicados. Debes manejar el código de error de tu aplicación.

MySQL debería devolver un código de error de 1062 (o SQLSTATE 23000) cuando se viola su restricción de clave única.

Otros consejos

Por la forma en que describió el temor de encontrar un DEADLOCK, es posible que la causa no se entienda claramente (a menos que su consulta tenga más de lo que se describe en la pregunta).

Un buen resumen que alguien más escribió :

  
      
  1. La consulta 1 comienza bloqueando el recurso A
  2.   
  3. La consulta 2 comienza bloqueando el recurso B
  4.   
  5. La consulta 1, para continuar, necesita un bloqueo en el recurso B, pero la consulta 2 está bloqueando ese recurso, por lo que la consulta 1 comienza a esperar a que se libere
  6.   
  7. Mientras tanto, la Consulta 2 intenta finalizar, pero necesita un bloqueo en el recurso A para finalizar, pero no puede obtener eso porque la Consulta 1 tiene el bloqueo en eso.
  8.   
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top