少し前に、「ORACLE でコミットされていないトランザクションの SQL ステートメントを見つけることはできますか?」というタイトルのブログ記事を書きました。では、MySQL データベースでは、コミットされていないトランザクションによって実行された SQL ステートメントや、コミットされていないトランザクションの関連情報を見つけることはできるのでしょうか? 実験では、セッション (接続) 内にコミットされていないトランザクションがあり、操作が実行されていない場合、スレッドはスリープ状態になることが検証されました。 mysql> デュアルから connection_id() を選択します。 +-----------------+ | 接続ID() | +-----------------+ | 6 | +-----------------+ セット内の 1 行 (0.00 秒) mysql> セッションの自動コミットを 0 に設定します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> id =1 の kkk から削除します。 クエリは正常、1 行が影響を受けました (0.00 秒) マイSQL> 別のセッション (接続) で、10 秒以上コミットされていないトランザクションの詳細情報を照会します。 t.trx_mysql_thread_idを選択します ,t.trx_state ,t.trx_tables_in_use ,t.trx_tables_locked ,t.trx_クエリ ,t.trx_rows_locked ,t.trx_rows_modified ,t.trx_lock_structs ,t.trx_開始 ,t.trx_isolation_level 、p.時間 、p.ユーザー 、p.ホスト ,p.db ,p.コマンド information_schema.innodb_trx から INNER JOIN 情報_schema.processlist p オン t.trx_mysql_thread_id = p.id t.trx_state = 'RUNNING'の場合 かつp.time > 10 かつ、p.command = 'Sleep'\G 上記のスクリーンショットに示すように、trx_query は NULL 値です。コミットされていないトランザクションの SQL ステートメントを見つけることは基本的に不可能です。MySQL 内のトランザクションに関する情報はあまり詳細ではなく、むしろ簡潔すぎるとも言えます。そのテーブルのどこでロックが起こっているのかさえわかりません。 trx_row_locked、trx_row_modified、trx_started などの情報のみが表示されます。 mysql> エンジンの innodb ステータスを表示します。 ---トランザクション 1282583、アクティブ 11937 秒 ロック構造体 2 個、ヒープ サイズ 360、行ロック 8 個、UNDO ログ エントリ 1 MySQL スレッド ID 6、OS スレッド ハンドル 0x7f8da2de3700、クエリ ID 190 localhost root コミットされていないトランザクションが他のセッションをブロックする場合、コミットされていないトランザクションによって実行されたSQLを見つけることが可能です(可能性は1つだけで、多くのシナリオでは、コミットされたトランザクションに関連するSQLを見つけることは不可能です)。 次のテストに示すように、セッション (接続 mysql> セッションの自動コミットを 0 に設定します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> connection_id() を選択します。 +-----------------+ | 接続ID() | +-----------------+ | 11 | +-----------------+ セット内の1行(0.01秒) mysql> id=1 の kkk から削除します。 クエリは正常、1 行が影響を受けました (0.00 秒) マイSQL> 別のセッション (接続) がレコードを更新する操作を実行します。このとき、SQL はブロックされます。 mysql> connection_id() を選択します。 +-----------------+ | 接続ID() | +-----------------+ | 13 | +-----------------+ セット内の 1 行 (0.00 秒) マイSQL> mysql> update kkk set id=100 where id=1; 別のセッションで、次の SQL を実行して、コミットされていないトランザクションによって実行された最後の SQL を見つけることができます。 mysql> r.trx_id を選択して、waiting_trx_id を指定します。 -> r.trx_mysql_thread_id 待機スレッド、 -> r.trx_query 待機クエリ、 -> b.trx_id ブロッキングtrx_id、 -> b.trx_mysql_thread_id ブロッキングスレッド、 -> b.trx_query ブロッキングクエリ -> information_schema.innodb_lock_waits から w -> 内部結合 information_schema.innodb_trx b -> ON b.trx_id = w.blocking_trx_id -> 内部結合 information_schema.innodb_trx r -> ON r.trx_id = w.requesting_trx_id; +----------------+----------------+----------------------------------+-----------------+-----------------+----------------+ | 待機中の trx_id | 待機中のスレッド | 待機中のクエリ | ブロッキング中の trx_id | ブロッキング中のスレッド | ブロッキング中のクエリ | +----------------+----------------+----------------------------------+-----------------+-----------------+----------------+ | 2830 | 13 | kkk を更新し、id=100 に設定します (id=1 の場合) | 2825 | 11 | NULL | +----------------+----------------+----------------------------------+-----------------+-----------------+----------------+ セット内の 1 行 (0.00 秒) mysql> a.sql_textを選択します。 -> c.id、 -> d.trx_started -> performance_schema.events_statements_current から -> performance_schema.threads b を結合 -> ON a.thread_id = b.thread_id -> 情報スキーマ.プロセスリスト c を結合する -> ON b.processlist_id = c.id -> information_schema.innodb_trx d を結合します -> ON c.id = d.trx_mysql_thread_id -> c.id=11の場合 -> ORDER BY d.trx_started\G; ************************** 1. 行 **************************** sql_text: ID =1 の kkk から削除 id: 11 開始日時: 2019-06-12 23:36:13 セット内の1行(0.03秒) エラー: クエリが指定されていません マイSQL> 要約: 基本的に、MySQL は、trx_mysql_thread_id など、コミットされていないトランザクションの基本情報のみを見つけることができます。シナリオによっては、コミットされていないトランザクションによって実行された SQL などの詳細情報を確認する方法がほとんどありません。コミットされていないトランザクションに対してどのような操作が実行されたかは不明です。 さて、今回の記事は以上です。この記事の内容が皆さんの勉強や仕事に少しでも参考になれば幸いです。123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: JavaScript の parseInt() の魔法についての簡単な説明
>>: Linux ファイルを分割するための split コマンドの詳細な説明
目次序文事例: JD.com の虫眼鏡効果の模倣オフセットシリーズクライアントシリーズスクロールシリ...
序文MySQL 8.0.13 では、インデックス スキップ スキャン (インデックス ジャンプ スキ...
1つ目:通常動作 選択 SUM(ddd) AS count_days、 場合 aa.days >...
今日のタスク1. Linuxディストリビューションの選択2.vmwareが仮想マシン(centos)...
コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...
CUDA とは何かを紹介するのではなく、複数の CUDA バージョンの共存とリアルタイム切り替えをど...
nginx、mysql、tomcat などのサービスをインストールするときに、使用する必要があるポー...
MacBookにpython3.7.0をインストールする詳細な手順は、参考までに記録されています。具...
ヒント:配列変更メソッドによりv-forが更新され、ページが更新されます。配列を変更しないメソッド:...
この記事では、WebSocketを使用して簡単なチャットルームの会話を実装するための具体的なコードを...
目次プロジェクトでデータベースを操作する3つのステップデータベースを操作するための具体的な手順1: ...
効果: GROUP_CONCAT関数は、フィールド値を文字列に連結することができます。デフォルトの区...
この記事では、セグメンター効果を実現するためのvue uniappの具体的なコードを参考までに共有し...
チェックボックスの使用を実装するために画像を使用する必要がある場合は、それを使用して実装できます。実...
この記事の例では、スライダー間隔コンポーネントを実装するためのjsの具体的なコードを参考までに共有し...