2012-04-24 40 views
2

MySQL documentation on transactions似乎缺乏,情报的一个重要的部分,那就是我的问题:自动回滚,如果程序退出

如果交易正在进行中,客户端断开连接(在我的情况下,如果PHP exit S或die()或直接到达代码的末尾),事务是回滚还是提交?

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

如果这有什么差别,所有的表都使用InnoDB引擎。

回答

3

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

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

+0

谢谢你的确认:) – 2012-04-25 01:01:44

1

根据此页: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'); 
+0

我发现这种行为后,我不小心忘了'COMMIT' Ajax响应返回到一个特别复杂的前查询。可以理解的是我踢了自己。 – 2012-04-27 10:12:32

+0

它应该是//在catch语句中自动回滚,而不是//提交 – 2014-09-22 11:29:50