打开两个mysql
命令行客户端并连接到您的数据库。在客户端 #1 中,输入
START TRANSACTION;
在客户端 #2 中,使用SHOW PROCESSLIST
,然后
KILL [n];
n
客户端 #1 的连接的 ID在哪里。Bam——事务回滚。但客户#1 不知道这一点。然后从客户端 #1 发送一些命令——比如说,
UPDATE clients SET important_field = NULL;
你会得到回应:
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Query OK, 10000 rows affected (0.05 sec)
Rows matched: 10000 Changed: 10000 Warnings: 0
哎呀,你说,打得更好ROLLBACK!
然后你意识到,令你惊恐的是,你不再进行交易了。
这是我的问题:如果我想KILL
在某个时候建立连接,有什么方法可以确保这种“现在你在交易中,现在你不在”的情况不会发生,除非将自动提交设置为0 在系统级别?
请注意,上面的内容是在mysql
5.1 下测试的——如果以后的版本提供了修复,我很想听听。我还希望看到使用 JDBC、ADO.NET 等进行的测试,看看它们是否容易受到同样问题的影响。
(在元注释中,这个问题来自 Server Fault 的两个问题。我真的希望 DBA 社区能提供更多帮助......)
更新:请参阅下面的答案。这个问题似乎是mysql
命令行实用程序所独有的,具有奇怪的自动重新连接“功能”。最有可能的是,任何不是建立在实用程序之上的工具或库mysql
都不会表现出这种行为。但是,您可能需要测试您正在使用的任何内容以确保确定,或者接受 drachenstern 的建议并将您的事务包装在存储过程中。