的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