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 サービスを確立して分析する手順

ブログ    

推薦する

CSS設定div背景画像実装コード

コンポーネントに背景画像コントロールを追加するには、次の 2 つの手順だけが必要です。 <表示...

ページ切り替え効果を実現するJSコード

この記事の例では、ページ切り替え効果を実現するためのJSコードの具体的なコードを参考までに共有してい...

Gitコミットログの変更方法のまとめ

ケース1: 最後の提出とプッシュなし次のコマンドを実行します。 git コミット --amend g...

HTMLデータ送信投稿_PowerNode Java Academy

HTTP/1.1 プロトコルで指定されている HTTP リクエスト メソッドには、OPTIONS、...

さまざまな種類のMySQLインデックス

インデックスとは何ですか?インデックスは、データベース ストレージ エンジンが指定されたデータをすば...

Linux での MySQL 5.7.19 (tar.gz) インストール グラフィック チュートリアル

Linux で MySQL-5.7.19 バージョンをインストールするための最初のチュートリアル。す...

vue+springbootでログイン認証コードを実現

この記事では、ログイン認証コードを実装するためのvue+springbootの具体的なコードを例とし...

webpackでCSSを分割・圧縮し、リンクでインポートする手順

まずコードファイルの構造を見てみましょう。エントリファイル (index1.js) の内容: ...

Linux システムでのスケジュールされたタスクの紹介

目次1. 計画タスクをカスタマイズする2. 時間を同期する3. 練習する4. セキュリティの問題1....

Nginx プロキシ axios リクエストと注意事項

序文最近、小さなデモを作成しました。大規模な工場のオンライン データを使用したため、インターフェイス...

CSS と Bootstrap アイコンを使用して、上下にジャンプするインジケーター矢印のアニメーション効果を作成します。

ページが非常に長い場合は、下にさらにコンテンツがあることをユーザーに知らせるために矢印が必要になるこ...

Vue は Tencent Map を統合して API を実装します (デモ付き)

目次執筆の背景プロジェクトの説明事前準備注記執筆の背景以前のプロジェクトではTencent Maps...

Windows 10 での MySQL 8.0.19 のインストールと設定のチュートリアル

来学期にMySQLを勉強します。事前に自宅で練習していませんでした。インストールに時間がかかるとは思...

ウェブ理論: 考えさせない読書ノート

第 1 章<br /> Web ページをユーザーにとって使いやすいものにするための最も重...

Nginx を使用して https ルートドメイン名への 301 リダイレクトを実装するためのサンプル コード

SEO とセキュリティを考慮して、301 リダイレクトが必要です。以下の一般的な処理には Nginx...