ホームページ  >  記事  >  バックエンド開発  >  PHP では、トランザクションを開始した後、プログラムは例外をスローし、コミットもロールバックも実行されません。MySQL トランザクションはロールバックされますか?

PHP では、トランザクションを開始した後、プログラムは例外をスローし、コミットもロールバックも実行されません。MySQL トランザクションはロールバックされますか?

WBOY
WBOYオリジナル
2016-08-10 09:07:172179ブラウズ

トランザクションを開いた後、SQL ステートメントの実行エラーまたはプログラム エラーが発生するという意見がネット上にありました。ロールバックが実行されないと、次回実行時にコミットが自動的にコミットされます。
ロールバックは実行されません。プログラムエラーが発生した場合はロールバックします

しかし、MySQL にコミットされていないトランザクションがある場合、この時点で自動的に送信される AUTOCOMMIT パラメータは 0 であるべきだと言う人もいます。
ただし、他の言語の MySQL ドライバーを介して操作する場合、これらのドライバーには通常、リクエストの処理が完了した後、未処理のトランザクションが自動的に AUTOCOMMIT を回復する機能があります。

返信内容:

インターネット上では、トランザクションを開いた後、SQL ステートメントの実行エラーまたはプログラム エラーが発生し、ロールバックが実行されないと、次回の実行は自動的にコミットされる
プログラム エラーはロールバックされない

と言っている人もいます。

しかし、MySQL にコミットされていないトランザクションがある場合、この時点で自動的に送信される AUTOCOMMIT パラメータは 0 であるべきだと言う人もいます。
ただし、他の言語の MySQL ドライバーを介して操作する場合、これらのドライバーには通常、リクエストの処理が完了した後、未処理のトランザクションが自動的に AUTOCOMMIT を回復する機能があります。

ここでは、デフォルトで PDO を使用していると仮定します。
公式文書には次のように書かれています:

スクリプトが終了するとき、または接続が閉じられようとしているときに、未処理のトランザクションがある場合、PDO はそれを自動的にロールバックします。これは、スクリプトが予期せず終了した場合の不整合を避けるための安全対策です。トランザクションを明示的にコミットしなかった場合は、何か問題が発生したと考えられるため、データの安全性を確保するためにロールバックが実行されます。
スクリプトが終了するとき、または接続が閉じられようとしているとき

スクリプトが終了したとき(正常終了、異常終了を含む)を指します。

PDO は自動的にロールバックします

PDO は自動的にロールバックされます。
この文書はそれを非常に明確にしました。
PDO ドライバーを使用していない場合は、関連するドライバーのドキュメントを確認するか、質問にどのドライバーを使用しているかを明確に記載してください。

ちなみに、以前の mysql_connect() 関数は公式には推奨されなくなりました (非推奨になりました)。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。