在MySQL中显示打开的事务
我做了一些没有提交的查询。 然后应用程序停止。
我如何显示这些打开的事务并提交或取消它们?
我如何显示这些打开的事务并提交或取消它们?
没有公开的事务,MySQL将在重新连接时回滚事务。
你不能提交交易(IFAIK)。
您使用显示线程
SHOW FULL PROCESSLIST
请参阅: http : //dev.mysql.com/doc/refman/5.1/en/thread-information.html
它不会帮助你,因为你不能从一个断开的连接提交一个事务。
连接中断时会发生什么?
从MySQL文档: http : //dev.mysql.com/doc/refman/5.0/en/mysql-tips.html
4.5.1.6.3。 禁用mysql自动重新连接
如果mysql客户端在发送语句时失去与服务器的连接,它立即自动尝试重新连接一次到服务器并再次发送语句。 但是 ,即使mysql成功重新连接,您的第一个连接也已经结束,您以前的会话对象和设置都将丢失 :临时表,自动提交模式以及用户定义和会话variables。 此外, 任何当前事务回滚 。
这种行为可能会对您造成危险,如以下示例所示,服务器在第一个和第二个语句之间closures并重新启动,但您不知道:
另请参阅: http : //dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html
如何诊断和解决这个问题
要检查自动重新连接:
如果发生自动重新连接(例如,由于调用mysql_ping()),则没有明确的指示。 要检查重新连接,请在调用
mysql_thread_id()
之前调用mysql_thread_id()
以获取原始连接标识符,然后再次调用mysql_thread_id()
以查看标识符是否已更改。
确保你保持最后一个查询(交易)在客户端,以便您可以重新提交,如果需要的话。
并禁用自动重新连接模式,因为这是危险的,而是实现自己的重新连接,以便知道何时发生丢弃,并且可以重新提交该查询。
您可以使用show innodb status
(或者为新版本的mysql show engine innodb status
)来获取InnoDB引擎当前所有正在执行的操作的列表。 在输出的墙上埋葬交易,以及他们正在运行的内部过程ID。
您将无法强制执行这些事务的提交或回滚,但是您可以杀死正在运行它们的MySQL进程,这基本上归结为回滚。 它杀死了进程的连接,并导致MySQL清理左边的混乱。
以下是您想要查找的内容:
------------ 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
在这种情况下,现在只有一个连接到InnoDB引擎(我的login,运行show
查询)。 如果这一行是一个真正的连接/卡住事务,你想终止,那么你会kill 10594
。
虽然在这种情况下不会有任何剩余的事务,如@Johan所说,如果你愿意,你可以在下面的查询中看到InnoDB中的当前事务列表。
SELECT * FROM information_schema.innodb_trx\G
从文件 :
INNODB_TRX表包含当前在InnoDB内执行的每个事务(不包括只读事务)的信息,包括事务是否在等待锁,事务何时开始以及事务正在执行的SQL语句(如果有的话)。