3

关于事务的MySQL 文档似乎缺少一个重要的信息,这是我的问题:

如果事务正在进行并且客户端断开连接(在我的情况下,如果 PHPexitdie()s 或只是到达代码的末尾),事务是回滚还是提交?

我假设回滚,但如果假设错误,这可能是一个大问题......

如果有任何区别,所有表都使用 InnoDB 引擎。

4

2 回答 2

5

在正常情况下,客户端断开连接会导致 MySQL 发生回滚。但是,如果您的服务器意外停机(例如硬件或网络故障),可能需要一些时间才能断开您的客户端。在手册中,28800 秒是服务器在回滚事务之前等待活动的默认值。

您可以调整wait_timeout服务器上的设置或interactive_timeout属性以缩短此设置。

于 2012-04-25T00:47:53.727 回答
2

根据这个页面: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');
于 2012-04-27T07:25:24.633 回答