2012-04-24 9 views
2

MySQL documentation on transactionsがinformatonの一つの重要な部分を欠いているように見える、そしてそれは私の質問で終了した場合:自動ロールバックプログラムは

トランザクションが進行し、クライアントが切断されている場合(私の場合、もしPHP exitのかをdie())、トランザクションがロールバックされているか、コミットされていますか?

私はそれがすべての違いを作る場合は、すべてのテーブルがInnoDBエンジンを使用している...

をロールバックしますが、前提が間違っている場合には、大規模な問題になる可能性が想定しています。

答えて

3

通常、クライアントを切断すると、MySQLでロールバックが発生します。ただし、サーバーが予期せず停止した場合(ハードウェアやネットワークの障害など)、クライアントを切断するまでに時間がかかることがあります。マニュアルから、トランザクションをロールバックする前にサーバーがアクティビティーを待機するデフォルト値は28800秒です。

サーバー上でwait_timeoutの設定を調整したり、interactive_timeoutプロパティを調整してこれを短縮することができます。このページによると

+0

が確認:) –

1

http://www.weberdev.com/ViewArticle/Using-Transactions-In-MySQL-Part-1

」...あなたが取引を開始しますが、COMMITまたはROLLBACKを発行する前にセッションを終了した場合、MySQLははないは自動COMMITを実行しないことに注意することは興味深いことです代わりに、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

いただきありがとうございます、私は誤って特に複雑にAJAXの応答を返す前にCOMMIT' 'を忘れてしまった後、私はこの行動に気づきましたクエリ。わかりやすく私は自分自身を蹴った。 –

+0

//コミットされていないcatchステートメントの自動ロールバック –