关于事务的MySQL 文档似乎缺少一个重要的信息,这是我的问题:
如果事务正在进行并且客户端断开连接(在我的情况下,如果 PHPexit
或die()
s 或只是到达代码的末尾),事务是回滚还是提交?
我假设回滚,但如果假设错误,这可能是一个大问题......
如果有任何区别,所有表都使用 InnoDB 引擎。
关于事务的MySQL 文档似乎缺少一个重要的信息,这是我的问题:
如果事务正在进行并且客户端断开连接(在我的情况下,如果 PHPexit
或die()
s 或只是到达代码的末尾),事务是回滚还是提交?
我假设回滚,但如果假设错误,这可能是一个大问题......
如果有任何区别,所有表都使用 InnoDB 引擎。
在正常情况下,客户端断开连接会导致 MySQL 发生回滚。但是,如果您的服务器意外停机(例如硬件或网络故障),可能需要一些时间才能断开您的客户端。在手册中,28800 秒是服务器在回滚事务之前等待活动的默认值。
您可以调整wait_timeout
服务器上的设置或interactive_timeout
属性以缩短此设置。
根据这个页面:http ://www.weberdev.com/ViewArticle/Using-Transactions-In-MySQL-Part-1
“...有趣的是,如果您开始事务,但在发出 COMMIT 或 ROLLBACK 之前退出会话,MySQL 不会执行自动 COMMIT;相反,它会发出 ROLLBACK”
我做了一些测试来确认这一点,这里是每个场景的结果。(注意:当页面在没有 COMMIT 的情况下退出时,mysql 会自动回滚):
mysql_query("START TRANSACTION");
mysql_query("INSERT INTO log SET temp = 'test'");
exit("Exit\n"); // Auto rollback;
die( "Die\n"); // Auto rollback;
throw new Exception("Exception\n"); // Auto rollback;
try {
throw new Exception("Exception\n");
} catch(Exception $e) {
echo "Caught\n"; // Committed;
}
require_once('invalid_file.php'); // Auto rollback;
mysql_query('COMMIT');