MySQLで最新のトランザクションIDを照会する方法

MySQLで最新のトランザクションIDを照会する方法

前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション ID を表示する必要が生じる場合があります (たとえば、トランザクション ID の変更と前後の時間差を使用して各トランザクションの応答時間をカウントするなど)。

通常、現在のトランザクション ID を表示するには、次の 2 つの方法があります。

1. SHOW ENGINE INNODB STATUSを実行してトランザクション関連情報を表示します。

=====================================
150303 17:16:11 INNODB モニター出力
=====================================
過去15秒間の1秒あたりの平均を計算します
...
------------
取引
Trx ID カウンター 3359877657 -- 現在の最大トランザクション ID
トランザクション番号:o < 3359877468 のパージが完了しました。元に戻す番号:o < 0 状態: 実行中
履歴リストの長さ 324
各セッションのトランザクションのリスト:
---TRANSACTION 0、開始されていません -- このセッションで SHOW ENGINE INNODB STATUS を実行してもトランザクションは生成されないため、トランザクション ID は 0 です。
MySQL スレッド ID 4692367、OS スレッド ハンドル 0x51103940、クエリ ID 677284426 xx.173ops.com 10.xxx yejr init
/*!50000 エンジン*/ INNODBステータスを表示
---トランザクション 3359877640、開始されていません -- 非アクティブなトランザクション、開始されていません 使用中の mysql テーブル 1、ロック 0
MySQL スレッド ID 4678384、OS スレッド ハンドル 0x41a57940、クエリ ID 677284427 xx.173ops.com 10.xxx yejr システム ロック
polinfo0_.Fid を Fid39_0_ として選択します...

---トランザクション 3359877652、開始されていません
MySQL スレッド ID 4678383、OS スレッド ハンドル 0x50866940、クエリ ID 677284420 xx.173ops.com 10.xxx yejr クリーンアップ中

---トランザクション 3359877635、アクティブ 1358 秒、InnoDB 5000 内でスレッドが宣言されました --アクティブな長いトランザクション、1358 秒間実行され、まだ完了していません。注意してください。大量のロック待機が発生する可能性があります。mysql テーブル使用中 1、ロック 1
ロック構造体 1 個、ヒープ サイズ 376、行ロック 0 個、UNDO ログ エントリ 1
MySQL スレッド ID 3120717、OS スレッド ハンドル 0x529b4940、クエリ ID 677284351 xx.173ops.com 10.xxx yejr クエリ終了
t_live_room に挿入...

2. 3 つのテーブル INFORMATION_SCHEMA.INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS を確認します。この情報により、どのトランザクションが他のトランザクションをブロックしているかをすぐに見つけることができます。

まずINNODB_TRXテーブルをクエリして、どのようなトランザクションがあるかを確認します。

mysql> INFORMATION_SCHEMA.INNODB_TRX\G から * を選択
************************** 1. 行 ****************************
 trx_id: 17778 -- 現在のトランザクション ID
 trx_state: LOCK WAIT -- ロック待機状態、つまり他のセッションがロック リソースを解放するのを待機中 trx_started: 2015-03-04 10:40:26
 trx_requested_lock_id: 17778:82:3:6 -- 要求されるロック trx_wait_started: 2015-03-04 10:40:26
 trx_weight: 2 -- これは、ロックが 2 行のレコードに影響することを意味します trx_mysql_thread_id: 657 -- プロセスリスト内のスレッド ID
 trx_query: trx_fee を更新し、fee=rand()*1000 を設定します (id= 4)
 trx_operation_state: インデックス読み取り開始
 使用中のtrxテーブル: 1
 trx_tables_locked: 1
 trx_lock_structs: 2
 trx_lock_memory_bytes: 360
 ロックされた行数: 1
 trx_rows_modified: 0
 trx_concurrency_tickets: 0
 trx_isolation_level: 繰り返し読み取り
 trx_unique_checks: 1
 trx_foreign_key_checks: 1
 trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 10000
 trx_is_read_only: 0
 trx_autocommit_non_locking: 0
 ************************** 2. 行 ****************************
 トランザクションID: 17773
 trx_state: 実行中
 trx_started: 2015-03-04 10:40:23
 trx_requested_lock_id: NULL
 trx_wait_started: NULL
 trx_weight: 10
 trx_mysql_スレッドID: 656
 trx_query: NULL
 trx_operation_state: NULL
 使用中のtrxテーブル: 0
 trx_tables_locked: 0
 trx_lock_structs: 2
 trx_lock_memory_bytes: 360
 ロックされた行数: 9
 trx_rows_modified: 8
 trx_concurrency_tickets: 0
 trx_isolation_level: 繰り返し読み取り
 trx_unique_checks: 1
 trx_foreign_key_checks: 1
 trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 10000
 trx_is_read_only: 0
 trx_autocommit_non_locking: 0

INNODB_LOCKS テーブルを参照して、どのようなロックが存在するかを確認します。

mysql> information_schema.INNODB_LOCKS\G から * を選択します
************************** 1. 行 ****************************
lock_id: 17778:82:3:6 -- 現在のロック ID
lock_trx_id: 17778 --ロックに対応するトランザクションID
lock_mode: X -- ロックタイプ、排他ロック X
lock_type: RECORD -- ロック範囲、レコード ロック: レコード ロック、その他のロック範囲: ギャップ ロック: ギャップ ロック、または次のキー ロック (レコード ロック + ギャップ ロック)
lock_table: `test`.`trx_fee`
lock_index: PRIMARY -- ロックがロードされているインデックス lock_space: 82
ロックページ: 3
ロック_rec: 6
ロックデータ: 4
************************** 2. 行 ****************************
ロックID: 17773:82:3:6
ロック_trx_id: 17773
ロックモード: X
ロックタイプ: レコード
lock_table: `test`.`trx_fee`
lock_index: プライマリ
ロックスペース: 82
ロックページ: 3
ロック_rec: 6
ロックデータ: 4

最後に、INNODB_LOCK_WAITS テーブルを見て、現在待機しているロックを確認します。

mysql> information_schema.INNODB_LOCK_WAITS\G から * を選択します
************************** 1. 行 ****************************
requesting_trx_id: 17778 -- ロックを要求しているトランザクション ID (待機側)
要求されたロックID: 17778:82:3:6 -- 要求されたロックID
blocking_trx_id: 17773 -- ロックをブロックしているトランザクション ID (現在の保持者、解放を待機中)
ブロッキングロックID: 17773:82:3:6 -- 保持されているロックのID

INFORMATION_SCHEMA の InnoDB に関連するテーブルの使用法については、マニュアル「21.29 INFORMATION_SCHEMA InnoDB のテーブル」を参照してください。

3. perconaブランチの機能を使用して、現在の最新のトランザクションIDを表示します。この機能はバージョン5.6.11-60.3以降で導入されました。表示するには、次の2つのコマンドを実行します。

mysqladmin ext | grep Innodb_max_trx_id
または、mysql> show global status like 'Innodb_max_trx_id';

最後に、問題の原因について説明します。友人がこの問題について私と話し合ったところ、Java 接続プールで 2 つのトランザクションのトランザクション ID が同じであることがわかったとのことでした。テストの SQL コードは次のとおりです。

begin; trx を更新し、un=rand() を設定します。ここで、id は round(rand()*10)+1 です。information_schema.INNODB_TRX から * を選択してください。commit; sleep(0.01) を選択してください。begin; trx を更新し、un=rand() を設定します。ここで、id は round(rand()*10)+1 です。information_schema.INNODB_TRX から * を選択してください。commit;

このコード文字列はラップできず、中間のスリープ期間が長すぎることもできません。つまり、シミュレーションが十分に高速な場合は、2 つのトランザクションの ID が変更されたかどうかを確認します。時間が十分に短ければ、2 回照会されたトランザクション ID は同じであり、変更されていないことがわかります。ご自身の環境で試すこともできます。

上記は、MySQL で現在の最新のトランザクション ID を照会する方法の詳細です。MySQL のトランザクション ID 照会の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL は ACID トランザクションをどのように実装しますか?
  • MySQL が大規模トランザクションを避けるべき理由とその解決方法
  • MySQL 8.0 の新機能の分析 - トランザクション データ ディクショナリとアトミック DDL
  • MySQLトランザクションとSpring分離レベルの実装原理の詳細な説明
  • MySQL トランザクションの概念と使用法の詳細な説明
  • MySQL トランザクション分離レベルの表示と変更の例
  • Mysql データベースの高度なビュー、トランザクション、インデックス、自己接続、ユーザー管理の例の分析の使用
  • MySql のインデックス、ロック、トランザクションの知識ポイントのまとめ
  • MySql の知識ポイント: トランザクション、インデックス、ロックの原則、使用状況の分析
  • MySQL でのトランザクションの使用方法

<<:  フロントエンドJavaScriptは関数のカリー化を完全に理解している

>>:  VMware 仮想マシンで HTTP サービスを確立して分析する手順

推薦する

CSS3のwebkit-box-reflectを巧みに使用して、さまざまな動的効果を実現します。

かなり前の記事で、 -webkit-box-reflectプロパティについて説明しました。リフレクシ...

インタラクションデザインと心理学の驚くべきつながり18選

デザイナーは心理学を理解する必要があるデザイナーが知るべき心理学という本は非常に興味深いです。まず、...

Docker-compose ネットワークの詳細な例

今日は Docker でのネットワーク設定を試し、後で忘れないようにプロセスを記録しました。 (シス...

MySQL のデバッグと最適化に関する 101 のヒントを共有する

MySQL は強力なオープンソース データベースです。データベース駆動型アプリケーションの数が増える...

Ubuntu20.04 VNCのインストールと設定の実装

VNC はリモート デスクトップ プロトコルです。 VNC を使用して Ubuntu 20.04 を...

Vue elementUI フォームのネストされたテーブルと各行の検証の詳細な説明

目次エフェクト表示コードリンクキーコード表形式データコンポーネントのネスト検証方法リセット方法完全な...

docker mysqlの起動時に初期化SQLを実行する

1.Mysqlイメージを取得するdocker pull mysql:5.7 2. MySQLイメージ...

Dockerを使用してMQTTサーバーを構築するプロセスの詳細な説明

1. イメージをプルするdocker pull registry.cn-hangzhou.aliyu...

HTMLはBaidu百科事典のナビゲーションドロップダウンメニュー機能を模倣します

HTML は、Baidu 百科事典のナビゲーション ドロップダウン メニュー機能を模倣します。具体的...

MySQL 5.7.27 のダウンロード、インストール、設定に関する詳細なチュートリアル

目次1. ダウンロード手順2. 環境変数を設定する3. my.iniファイルを設定する4. MySQ...

vue3.0 で要素を使用するための完全な手順

序文: vue3.0の要素フレームワークを使用します。要素はvue2.0をサポートしており、vue3...

MySQLインスタンスクラッシュ事例の詳細な分析

[問題の説明]私たちの実稼働環境には、複数の MySQL サーバー (MySQL 5.6.21) の...

Flash での HTML と CSS の適用

Flash での HTML と CSS の適用:同僚の Den が Flash で HTML と C...

CentOS 7 に Percona Server+MySQL をインストールする

1. 環境の説明(1) CentOS-7-x86_64、カーネルバージョン uname -r は、 ...