MySQL でコミットされていないトランザクション情報を見つける方法

MySQL でコミットされていないトランザクション情報を見つける方法

少し前に、「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 などの情報のみが表示されます。 show engine innodb statusを使用する場合も同様です。基本的な情報のみが表示されます。

mysql> エンジンの innodb ステータスを表示します。

---トランザクション 1282583、アクティブ 11937 秒

ロック構造体 2 個、ヒープ サイズ 360、行ロック 8 個、UNDO ログ エントリ 1

MySQL スレッド ID 6、OS スレッド ハンドル 0x7f8da2de3700、クエリ ID 190 localhost root

コミットされていないトランザクションが他のセッションをブロックする場合、コミットされていないトランザクションによって実行されたSQLを見つけることが可能です(可能性は1つだけで、多くのシナリオでは、コミットされたトランザクションに関連するSQLを見つけることは不可能です)。

次のテストに示すように、セッション (接続connection_id=11 ) で削除操作が実行されましたが、トランザクションはコミットされませんでした。

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 をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL トランザクション分離レベルの表示と変更の例
  • MySQLにおけるACIDトランザクションの実装原理の詳細な説明
  • 更新とデータ整合性処理のためのMySQLトランザクション選択の説明
  • Mysqlは実行中のトランザクションを照会し、ロックを待機する方法
  • Javaで実装されたMySQLトランザクション処理操作の例
  • PHP+MySQL の高同時ロックトランザクション処理問題の解決方法
  • MySQLでトランザクションを開始する方法

<<:  JavaScript の parseInt() の魔法についての簡単な説明

>>:  Linux ファイルを分割するための split コマンドの詳細な説明

推薦する

vmware16 仮想マシンに共有フォルダを設定する方法

1. 仮想マシンに共有フォルダを設定します。 1. 処理する仮想マシンを選択し、右クリックして設定...

Windows7 での Mysql5.7 my.ini ファイルの読み込みパスとデータの場所の変更方法

更新: MySQL の公式 Web サイトにアクセスして MySQL インストーラーをインストールし...

HTMLテーブルタグの詳しい解説(初心者向け)

表> <TR> <TD> <TH> <キャプション&...

Vue でコンポーネントを一括インポート、登録、使用する方法

序文コンポーネントは、非常に頻繁に使用されるものです。多くの人は、コンポーネントを 1 つのファイル...

CSS Houdini でダイナミックな波効果を実現

CSS Houdini は、CSS 分野における最もエキサイティングなイノベーションとして知られてい...

Next.js 入門チュートリアル

目次導入Next.jsプロジェクトを作成するNext.js プロジェクトを手動で作成するcreact...

高同時実行シナリオにおける nginx 最適化の詳細な説明

日常の運用・保守作業では、nginx サービスが頻繁に使用され、nginx の高同時実行性によって生...

MySQLのトランザクションとデータ一貫性処理の問題を分析する

この記事では、セキュリティ、使用方法、同時処理などを通じて、MySQL トランザクションとデータの一...

インタビューの質問: ホーリー グレイル レイアウトとダブル ウィング レイアウトの違い

序文今日は、聖杯レイアウトとダブルウィングレイアウト、そしてそれらの違いについてお話しします。この2...

MySQL データベース接続例外の概要 (収集する価値あり)

Centos にプロジェクトをデプロイするときに奇妙な問題が見つかりました。データベース接続で例外...

JSはカリキュラムタイムテーブルアプレット(スーパーカリキュラムタイムテーブルを模倣)を実装し、カスタムバックグラウンド機能を追加します

概要:市販されているいくつかのタイムテーブルソフトウェアから教訓を得ました。機能が複雑すぎるため、タ...

HTML チェックボックスとラジオボタンスタイルの美化の簡単な例

HTML チェックボックスとラジオボタンスタイルの美化の簡単な例チェックボックス: XML/HTML...

calc() で全画面背景の固定幅コンテンツを実現

ここ数年、Web デザインには「全幅背景と固定幅コンテンツ」というトレンドが生まれています。このデザ...

CSS でリスト スタイル属性を設定する方法 (この記事を読むだけ)

リストスタイルのプロパティHTMLには、順序なしリストと順序ありリストの2種類のリストがあります。仕...

イメージを再構築せずにDockerにポートを動的に追加する方法

操作中に Docker コンテナの公開ポートを変更または追加する必要がある場合がありますが、実行中の...