打开两个mysql命令行客户端并连接到您的数据库。在客户端 #1 中,输入
START TRANSACTION;
Run Code Online (Sandbox Code Playgroud)
在客户端 #2 中,使用SHOW PROCESSLIST,然后
KILL [n];
Run Code Online (Sandbox Code Playgroud)
n客户端 #1 连接的 ID在哪里。Bam——事务回滚。但是客户#1 不知道这一点。然后从客户端#1,发送一些命令——比如说,
UPDATE clients SET important_field = NULL;
Run Code Online (Sandbox Code Playgroud)
你会得到这样的回应:
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
Run Code Online (Sandbox Code Playgroud)
哎呀,你说,更好地击中ROLLBACK!然后你意识到,令你恐惧的是,你不再参与交易了。
这是我的问题:如果我想KILL在某个时候建立连接,有什么方法可以确保这种“现在你在一个事务中,现在你不在”的情况不会发生,除了将autocommit设置为0 系统级?
请注意,以上内容是在mysql5.1下测试的- 如果更高版本提供修复,我很想听听。我也很想看到用 JDBC、ADO.NET 等完成的测试,看看它们是否容易受到同样的问题的影响。
(在元注释上,这个问题来自 Server Fault 上的两个问题。我真的希望 DBA 社区能够提供更多帮助......)
更新 …