的MySQL documentation on transactions似乎缺乏,情报的一个重要的部分,那就是我的问题:自动回滚,如果程序退出
如果交易正在进行中,客户端断开连接(在我的情况下,如果PHP exit
S或die()
或直接到达代码的末尾),事务是回滚还是提交?
我假设回滚,但如果假设是错误的,可能是一个大问题......
如果这有什么差别,所有的表都使用InnoDB引擎。
的MySQL documentation on transactions似乎缺乏,情报的一个重要的部分,那就是我的问题:自动回滚,如果程序退出
如果交易正在进行中,客户端断开连接(在我的情况下,如果PHP exit
S或die()
或直接到达代码的末尾),事务是回滚还是提交?
我假设回滚,但如果假设是错误的,可能是一个大问题......
如果这有什么差别,所有的表都使用InnoDB引擎。
在正常情况下,客户端断开连接将导致MySQL中的回滚。但是,如果服务器意外关闭(例如,硬件或网络故障),则在断开客户端连接之前可能需要一些时间。在手册中,28800秒是服务器在回退事务之前等待活动的默认值。
您可以调整服务器上的wait_timeout
设置或interactive_timeout
属性以缩短此属性。
根据此页:http://www.weberdev.com/ViewArticle/Using-Transactions-In-MySQL-Part-1
” ......有趣的是,要注意的是,如果你开始交易,但发出COMMIT或ROLLBACK之前退出会议,MySQL不会把不执行自动提交;相反,它发出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');
我发现这种行为后,我不小心忘了'COMMIT' Ajax响应返回到一个特别复杂的前查询。可以理解的是我踢了自己。 – 2012-04-27 10:12:32
它应该是//在catch语句中自动回滚,而不是//提交 – 2014-09-22 11:29:50
谢谢你的确认:) – 2012-04-25 01:01:44