es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Innodb: Si ocurre un error de clave duplicada, se establece un bloqueo compartido en el registro de índice duplicado.

Fondo: mysql-refman-5.7

mysql> show create table t1 \G
*************************** 1. fila ***************************
       Tabla: t1
Crear Tabla: CREATE TABLE `t1` (
  `i` int(11) NOT NULL,
  PRIMARY KEY (`i`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 fila en el conjunto (0.00 seg)
mysql> select * from t1;
Conjunto vacío (0.00 seg)
sesión1: --------------- operación 1
iniciar transacción;
insertar en t1 valores (1);
sesión2: --------------- operación 2
insertar en t1 valores (1);
sesión3: --------------- operación 3
iniciar transacción;
insertar en t1 valores (1);
sesión1: --------------- operación 4
volver atrás;

La referencia explica el proceso anterior de la siguiente manera:

  1. La operación 1 adquiere un bloqueo exclusivo en la fila.
  2. Las operaciones 2 y 3 resultan en un error de clave duplicada y ambas solicitan un bloqueo compartido en la fila.
  3. Después de la operación 4, la sesión 1 libera su bloqueo exclusivo en la fila y las sesiones 2 y 3 obtienen el bloqueo compartido.

Q1:
¿Después de la operación 2 y 3, ambas sesiones están esperando el bloqueo exclusivo para la fila hasta que expire el tiempo si no se ejecuta la operación 4, verdad? Pero no hay mensajes de “error de clave duplicada” como en el elemento de la lista NO.2 anterior.
enter image description here

Q2:
¿Por qué las sesiones 2 y 3 solicitan un bloqueo compartido para la fila cuando ocurre un error de clave duplicada? ¿No debería terminar ambas sesiones como resultado de la excepción?

Q3:
¿Se lanzará un error de clave duplicada como mensaje de error?

Q4:
¿Por qué el error de clave duplicada no finaliza la sesión?
enter image description here

Tags:  , ,

Answer

  1. Avatar for davy.ai

    A1: El mensaje de error de clave duplicada puede no ser mostrado porque depende del cliente o aplicación que está ejecutando la instrucción. Algunos clientes o aplicaciones pueden no mostrar mensajes de error de forma predeterminada. Sin embargo, el error sigue ocurriendo y queda registrado en los registros del servidor.

    A2: Cuando ocurre un error de clave duplicada, la instrucción se deshace automáticamente y no se inserta ninguna fila. Sin embargo, la transacción no termina y la sesión no se cierra. La sesión todavía mantiene sus bloqueos y espera instrucciones adicionales. En este caso, tanto session2 como session3 están esperando el bloqueo exclusivo de la fila, pero no pueden adquirirlo porque session1 todavía mantiene el bloqueo. Por lo tanto, solicitan en su lugar un bloqueo compartido para esperar a que se libere el bloqueo.

    A3: El error de clave duplicada es lanzado como una excepción por el servidor, pero cómo se maneja depende del cliente o aplicación. Algunos clientes o aplicaciones pueden capturar la excepción y mostrar un mensaje de error, mientras que otros no lo hacen.

    A4: Como se mencionó en la pregunta 2, la transacción no termina y la sesión no se cierra cuando ocurre un error de clave duplicada. La sesión todavía mantiene sus bloqueos y espera instrucciones adicionales. Depende del cliente o aplicación decidir cómo manejar el error y si finalizar la sesión.

Comments are closed.