stored - Mostrar transacciones abiertas en MySQL
transacciones en workbench (3)
Hice algunas consultas sin un compromiso. Entonces la aplicación fue detenida.
¿Cómo puedo mostrar estas transacciones abiertas y confirmarlas o cancelarlas?
¿Cómo puedo mostrar estas transacciones abiertas y confirmarlas o cancelarlas?
No hay transacción abierta, MySQL revertirá la transacción al reconectarse.
No puede comprometer la transacción (IFAIK).
Muestra hilos usando
SHOW FULL PROCESSLIST
Ver: http://dev.mysql.com/doc/refman/5.1/en/thread-information.html
No lo ayudará, porque no puede comprometer una transacción a partir de una conexión interrumpida.
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. Deshabilitando la reconexión automática de mysql
Si el cliente de mysql pierde su conexión con el servidor mientras envía una declaración, inmediatamente intenta volver a conectarse una vez con el servidor y enviar la declaración de nuevo. Sin embargo , incluso si mysql logra reconectarse, su primera conexión ha finalizado y se pierden todos los objetos y configuraciones de la sesión anterior: tablas temporales, el modo de confirmación automática y variables de sesión y definidas por el usuario. Además, cualquier transacción actual se retrotrae .
Este comportamiento puede ser peligroso para usted, como en el ejemplo siguiente donde el servidor se apagó y se reinició entre la primera y la segunda afirmación sin que usted lo supiera:
También vea: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html
Cómo diagnosticar y corregir esto
Para verificar la reconexión automática:
Si se produce una reconexión automática (por ejemplo, como resultado de llamar a mysql_ping ()), no hay una indicación explícita de ello. Para verificar la reconexión, llame a
mysql_thread_id()
para obtener el identificador de conexión original antes de llamar amysql_ping()
, luegomysql_thread_id()
llamar amysql_thread_id()
para ver si el identificador ha cambiado.
Asegúrese de mantener su última consulta (transacción) en el cliente para que pueda volver a enviarla si es necesario.
Y deshabilite el modo de reconexión automática, porque eso es peligroso, implemente su propia reconexión en su lugar, para que sepa cuándo se produce una caída y puede volver a enviar esa consulta.
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 así lo desea.
SELECT * FROM information_schema.innodb_trx/G
Del documento :
La tabla INNODB_TRX contiene información sobre cada transacción (excluyendo las transacciones de solo lectura) que se está ejecutando dentro de InnoDB, incluyendo si la transacción está esperando un bloqueo, cuándo se inició la transacción y la declaración SQL que está ejecutando la transacción, si corresponde.
Puede usar show innodb status
(o show engine innodb status
para las versiones más nuevas de mysql) para obtener una lista de todas las acciones actualmente pendientes dentro del motor InnoDB. Enterrado en la pared de salida serán las transacciones, y qué ID de proceso interno se están ejecutando.
No podrá forzar una confirmación o reversión de esas transacciones, pero PUEDE anular el proceso MySQL que las ejecuta, que básicamente se reduce a una reversión. Mata la conexión de los procesos y hace que MySQL limpie el lío que queda.
Esto es lo que desea 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, ejecutar la consulta show
). Si esa línea fuera una conexión real / transacción bloqueada que quisieras terminar, entonces harías un kill 10594
.