ventajas transacciones stored sintaxis que las fundamentos consistencia mysql

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 a mysql_ping() , luego mysql_thread_id() llamar a mysql_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 .