2012-04-24 76 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