3

トランザクションに関する MySQL のドキュメントには、重要な情報が 1 つ欠けているようです。それが私の質問です。

トランザクションが進行中で、クライアントが切断された場合 (私の場合、PHPexitが s またはdie()s または単にコードの最後に達した場合)、トランザクションはロールバックされますか、それともコミットされますか?

ロールバックしたと仮定していますが、仮定が間違っていると大きな問題になる可能性があります...

違いがある場合は、すべてのテーブルが InnoDB エンジンを使用しています。

4

2 に答える 2

5

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

wait_timeoutただし、サーバーの設定またはプロパティを調整して、interactive_timeoutこれを短縮できます。

于 2012-04-25T00:47:53.727 に答える
2

このページによると: 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');
于 2012-04-27T07:25:24.633 に答える