Utilice el mecanismo de bloqueo del motor MySQL InnoDB para resolver el problema del punto muerto [2]
Índice KEY_TSKTASK_MONTIME (STATUS_ID MON_TIME)
Análisis Las dos declaraciones involucradas no deberían involucrar el mismo registro TSK_TASK, entonces, ¿por qué ocurre un punto muerto?
Al mirar la documentación en el sitio web de MySQL, descubrí que esto está relacionado con el mecanismo de indexación de MySQL. El motor InnoDB de MySQL es un bloqueo a nivel de fila, y mi entendimiento inicial fue que bloquearía las filas directamente, pero ese no es el caso.
Aquí está la esencia:
No bloquea filas, pero sí bloquea índices.
A los efectos de una operación ACTUALIZAR ELIMINAR, esto es lo mismo que el índice bloqueado. UPDATE DELETE MySQL no solo bloqueará todos los registros de índice escaneados según las condiciones WHERE, sino que también bloqueará las claves adyacentes, las llamadas declaraciones de bloqueo de siguiente tecla, como UPDATE TSK_TASK SET UPDATE_TIME = NOW() WHERE ID gt Bloqueará todos los registros cuya clave principal sea mayor o igual al valor del índice, y todos los registros cuya clave principal sea mayor o igual al valor del índice. No puede operar en registros con una clave principal igual a este valor hasta que se complete la declaración
Cuando un registro de índice no agrupado está bloqueado, el registro de índice agrupado relacionado también debe bloquearse para completar la operación p>
Al analizar las dos declaraciones SQL que causaron el problema, podemos encontrarlo fácilmente.
Cuando actualice TSK_TASK establezca STATUS_ID= UPDATE_TIME=now () donde STATUS_ID= y MON_TIME
Suponga que actualice TSK_TASK establezca STATUS_ID= UPDATE_TIME=now () y MON_TIME
Suponga que la actualización TSK_TASK establece STATUS_ID= UPDATE_TIME=now () y MON_TIME=now. Esta declaración primero bloquea el índice de agrupación (clave principal). Dado que el valor de STATUS_ID debe actualizarse, algunos registros de índice de KEY_TSKTASK_MONTIME también deben bloquearse. p>
La primera declaración bloquea el registro de KEY_TSKTASK_MONTIME y espera a que se actualice la clave principal, y luego bloquea el registro de KEY_TSKTASK_MONTIME. MONTTIME y espera el índice de clave principal, mientras que la segunda declaración bloquea el registro del índice de clave principal y espera el registro KEY_TSKTASK_MONTIME. En este caso, se produce un punto muerto
Resolví el problema del punto muerto dividiendo la primera declaración
En primer lugar, busqué la condición select ID de TSK_TASK donde STATUS_ID= y MON_TIME lt; (ahora() INTERVALO minuto) coincide con la ID y luego actualiza la actualización de estado TSK_TASK establece STATUS_ID= donde ID en (...)
En este punto, el problema del punto muerto está completamente resuelto. lishixinzhi/Article/program/MySQL/201311/29601
Esta es la primera vez que veo un problema de interbloqueo.