我在没有提交的情况下进行了一些查询。然后应用程序停止了。
我该如何显示这些未提交的事务并将其提交或取消?
我在没有提交的情况下进行了一些查询。然后应用程序停止了。
我该如何显示这些未提交的事务并将其提交或取消?
我怎样能够显示这些未完成的事务并进行提交或者取消?
如果没有未完成的事务,MySQL会在断开连接时回滚事务。
你无法提交该事务(据我所知)。
你可以使用以下代码来显示线程:
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成功重新连接,您的第一个连接也已经结束,并且您之前的所有会话对象和设置都已丢失:临时表、自动提交模式和用户定义的会话变量。另外,任何当前的事务都将回滚。
这种行为可能对您很危险,例如,在以下示例中,服务器在第一次和第二次语句之间关闭并重新启动,而您却不知道:
还可以参考: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html
如何诊断和解决这个问题
检查自动重连:
如果发生自动重新连接(例如由于调用mysql_ping()的结果),则没有明确的指示。要检查重新连接,请在调用mysql_ping()之前调用
mysql_thread_id()
以获取原始连接标识符,然后再次调用mysql_thread_id()
以查看标识符是否改变。
确保在客户端中保留您的最后一个查询(事务),以便在需要时可以重新提交它。
并且禁用自动重连模式,因为它会存在一些危险,需要自己实现重新连接,这样当出现连接断开时就能知道,并重新提交该查询。
mysqld.dll
,也称为客户端,并将包含完整事务的SQL语句保存在内存中,以便在连接断开时可以回放它。或者您可以将其保留在本地磁盘上,以便在重新启动时可以重新提交它。 - Johan虽然在这种情况下不会有任何剩余的交易,如@Johan所说,如果您想要查看InnoDB中的当前事务列表,则可以使用以下查询。
SELECT * FROM information_schema.innodb_trx\G
根据文档:
INNODB_TRX表中包含有关每个当前在InnoDB内部执行的事务(不包括只读事务)的信息,包括事务是否等待锁定、事务启动时间以及事务正在执行的SQL语句(如果有)。
\G
修饰符仅在您希望在 mysql 命令行工具内格式化查询输出时才有用。如果您使用的是图形用户界面工具,如 Mysql Workbench,则不需要它。 - barelltrx_mysql_thread_id
列对应于full processlist
中的连接ID。 - Eugene PankovSHOW FULL PROCESSLIST
没有显示我想要的事务,但这个语句显示了正在运行的事务。 - undefinedshow innodb status
(或者show engine innodb status
,如果是MySQL的新版本)来获取InnoDB引擎中目前处于等待状态的所有操作列表。在输出的大量信息中,会有一些关于事务以及它们正在运行的内部进程ID。------------
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引擎(即我的登录,运行“show”查询)。如果那一行是实际的连接/卡住的事务需要终止,您可以执行“kill 10594”。show engine innodb status
? - Pacerier列出所有:
SHOW FULL PROCESSLIST
如果您想杀掉一个挂起的事务,请复制事务 ID 并使用以下命令杀死该事务:
KILL <id> // e.g KILL 16543
使用下面的查询,您可以检查当前有多少个事务正在运行:
mysql> SELECT count(*) FROM information_schema.innodb_trx;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)