1. ホーム
  2. mysql

[解決済み] MySQLのオープントランザクションを表示する

2022-12-21 13:32:02

質問

コミットせずにいくつかのクエリを実行しました。その後、アプリケーションは停止しました。

これらのオープンなトランザクションを表示し、コミットまたはキャンセルするにはどうすればよいですか。

どのように解決するのですか?

<ブロッククオート

開いているトランザクションを表示し、コミットまたはキャンセルするにはどうすればよいですか?

MySQLは切断時にトランザクションをロールバックするため、開いているトランザクションはありません。

トランザクションをコミットすることはできません(IFAIK)。

スレッドを表示するには

SHOW FULL PROCESSLIST  

ご覧ください。 http://dev.mysql.com/doc/refman/5.1/en/thread-information.html

壊れた接続からトランザクションをコミットすることはできないので、それは役に立ちません。

接続が切れるとどうなるのでしょうか

MySQLのドキュメントから。 http://dev.mysql.com/doc/refman/5.0/en/mysql-tips.html

<ブロッククオート

4.5.1.6.3. mysql の自動再接続の無効化

mysql クライアントがステートメントを送信中にサーバとの接続を失った場合、即座に自動的にサーバに一度再接続し、ステートメントを再度送信しようと試みます。 しかし たとえ mysql が再接続に成功しても、最初の接続は終了しており、以前のすべてのセッションオブジェクトと設定は が失われます。 一時テーブル、自動コミットモード、ユーザ定義変数やセッション変数などです。また 現在のトランザクションはすべてロールバックされます。 .

この動作は、次の例のように、サーバがシャットダウンされ、知らない間に最初のステートメントと2番目のステートメントの間で再起動された場合、あなたにとって危険な場合があります。

も参照してください。 http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html

診断方法と修正方法

自動再接続を確認するため。

自動再接続が発生した場合(たとえば mysql_ping() を呼び出した結果)、そのことを明示的に示すものはありません。再接続を確認するには mysql_thread_id() を呼び出して元の接続識別子を取得してから mysql_ping() を呼び出したら、次に mysql_thread_id() を再度呼び出し、識別子が変更されたかどうかを確認します。

必要であれば再送信できるように、最後のクエリ(トランザクション)をクライアントに残しておくようにしてください。

そして、自動再接続モードは危険なので無効にし、代わりに独自の再接続を実装して、ドロップが発生したときにそのクエリを再送信できるようにします。