程序退出时自动回滚

时间:2012-04-24 23:19:07

标签: mysql transactions

MySQL documentation on transactions似乎缺少一条重要的信息,这是我的问题:

如果事务正在进行且客户端断开连接(在我的情况下,如果是PHP exitdie()或只是到达代码的末尾),则事务是否已回退,或者致力于?

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

根据此页面:http://www.weberdev.com/ViewArticle/Using-Transactions-In-MySQL-Part-1

“...有趣的是,如果你开始一个事务,但是在发出COMMIT或ROLLBACK之前退出会话,MySQL会执行自动COMMIT;相反,它会发出一个回滚“

我做了一些测试来确认这一点,以下是每个场景的结果。 (注意:当页面退出而没有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');