MySQL documentation on transactions似乎缺少一条重要的信息,这是我的问题:
如果事务正在进行且客户端断开连接(在我的情况下,如果是PHP exit
或die()
或只是到达代码的末尾),则事务是否已回退,或者致力于?
我假设已退回,但如果假设错误,这可能是一个大问题......
如果它有任何区别,所有表都使用InnoDB引擎。
答案 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');