Hice algunas consultas sin un compromiso. Entonces se detuvo la aplicación.
¿Cómo puedo mostrar estas transacciones abiertas y confirmarlas o cancelarlas?
Hice algunas consultas sin un compromiso. Entonces se detuvo la aplicación.
¿Cómo puedo mostrar estas transacciones abiertas y confirmarlas o cancelarlas?
Respuestas:
¿Cómo puedo mostrar estas transacciones abiertas y confirmarlas o cancelarlas?
No hay una transacción abierta, MySQL revertirá la transacción al desconectarse.
No puede confirmar la transacción (IFAIK).
Muestra hilos usando
SHOW FULL PROCESSLIST
Ver: http://dev.mysql.com/doc/refman/5.1/en/thread-information.html
No le ayudará, porque no puede realizar una transacción desde una conexión rota.
¿Qué sucede cuando se rompe una conexión?
De los documentos de MySQL: http://dev.mysql.com/doc/refman/5.0/en/mysql-tips.html
4.5.1.6.3. Deshabilitar la reconexión automática de mysql
Si el cliente mysql pierde su conexión con el servidor mientras envía una declaración, inmediatamente y automáticamente intenta volver a conectarse una vez al servidor y enviar la declaración nuevamente. Sin embargo , incluso si mysql logra reconectarse, su primera conexión ha finalizado y todos los objetos y configuraciones de su sesión anterior se pierden : tablas temporales, el modo de confirmación automática y las variables de sesión y definidas por el usuario. Además, cualquier transacción actual se revierte .
Este comportamiento puede ser peligroso para usted, como en el siguiente ejemplo en el que el servidor se apagó y reinició entre la primera y la segunda declaración sin que usted lo supiera:
Ver también: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html
Cómo diagnosticar y solucionar este problema
Para comprobar la reconexión automática:
Si ocurre una reconexión automática (por ejemplo, como resultado de llamar a mysql_ping ()), no hay ninguna indicación explícita de ello. Para verificar la reconexión, llame
mysql_thread_id()
para obtener el identificador de conexión original antes de llamarmysql_ping()
, luegomysql_thread_id()
vuelva a llamar para ver si el identificador ha cambiado.
Asegúrese de mantener su última consulta (transacción) en el cliente para poder volver a enviarla si es necesario.
Y deshabilite el modo de reconexión automática, ya que es peligroso, implemente su propia reconexión en su lugar, para que sepa cuándo ocurre una caída y puede volver a enviar esa consulta.
mysqld.dll
AKA el cliente. Y usted mantiene la declaración SQL que contiene la transacción completa en la memoria, de modo que pueda reproducirla cuando la conexión se interrumpa. O lo mantiene localmente en el disco, de modo que al reiniciarlo pueda volver a enviarlo.
Aunque no habrá ninguna transacción restante en el caso, como dijo @Johan, puede ver la lista de transacciones actual en InnoDB con la consulta a continuación si lo desea.
SELECT * FROM information_schema.innodb_trx\G
Del documento :
La tabla INNODB_TRX contiene información sobre cada transacción (excluidas las transacciones de solo lectura) que se están ejecutando actualmente dentro de InnoDB, incluido si la transacción está esperando un bloqueo, cuándo comenzó la transacción y la declaración SQL que se está ejecutando la transacción, si corresponde.
\G
modificador al final solo es útil si desea formatear la salida de la consulta dentro de la herramienta CLI de mysql. Si usa una herramienta GUI como Mysql Workbench, no la necesita.
Puede usar show innodb status
(o show engine innodb status
para versiones más recientes de mysql) para obtener una lista de todas las acciones actualmente pendientes dentro del motor InnoDB. Enterradas en la pared de salida estarán las transacciones y el ID de proceso interno bajo el que se ejecutan.
No podrá forzar una confirmación o una reversión de esas transacciones, pero PUEDE matar el proceso de MySQL que las ejecuta, lo que esencialmente se reduce a una reversión. Mata la conexión de los procesos y hace que MySQL limpie el desorden que dejó.
Esto es lo que querría buscar:
------------
TRANSACTIONS
------------
Trx id counter 0 140151
Purge done for trx's n:o < 0 134992 undo n:o < 0 0
History list length 10
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, process no 17004, OS thread id 140621902116624
MySQL thread id 10594, query id 10269885 localhost marc
show innodb status
En este caso, solo hay una conexión con el motor InnoDB en este momento (mi inicio de sesión, ejecutando la show
consulta). Si esa línea fuera una conexión real / transacción atascada que quisiera terminar, entonces haría un kill 10594
.
show engine innodb status
?
Listar todo:
SHOW FULL PROCESSLIST
si desea eliminar una transacción colgada, copie la identificación de la transacción y elimine la transacción usando este comando:
KILL <id> // e.g KILL 16543