sql >> Base de Datos >  >> RDS >> Mysql

MySQL Deadlock con una inserción que genera un disparador

El subproceso 2 mantiene un bloqueo compartido en la fila de la tabla de usuarios.

Luego, el subproceso 1 intenta obtener un bloqueo exclusivo en la misma fila y entra en espera de bloqueo.

Pero el subproceso 1 no tendrá la oportunidad de expirar, porque el subproceso 2 luego intenta escalar su bloqueo a exclusivo... pero para hacer eso, debe esperar al subproceso 1, que está en espera de bloqueo, pero está esperando hilo 2.

Cada uno está bloqueando al otro.

Eso es un punto muerto.

El servidor selecciona una transacción para matar, de modo que no se bloqueen entre sí innecesariamente.

La detección de puntos muertos permite que un subproceso tenga éxito inmediatamente a expensas del otro. De lo contrario, ambos estarían encerrados esperando hasta que uno de ellos muriera por esperar demasiado.

Está en modo de confirmación automática, pero, por supuesto, eso no significa que no esté en una transacción. Cada consulta con InnoDB todavía se maneja en una transacción, pero con la confirmación automática, la transacción se inicia implícitamente cuando la consulta comienza a ejecutarse y se confirma implícitamente cuando tiene éxito.