前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション 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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: フロントエンドJavaScriptは関数のカリー化を完全に理解している
>>: VMware 仮想マシンで HTTP サービスを確立して分析する手順
かなり前の記事で、 -webkit-box-reflectプロパティについて説明しました。リフレクシ...
デザイナーは心理学を理解する必要があるデザイナーが知るべき心理学という本は非常に興味深いです。まず、...
今日は Docker でのネットワーク設定を試し、後で忘れないようにプロセスを記録しました。 (シス...
MySQL は強力なオープンソース データベースです。データベース駆動型アプリケーションの数が増える...
VNC はリモート デスクトップ プロトコルです。 VNC を使用して Ubuntu 20.04 を...
目次エフェクト表示コードリンクキーコード表形式データコンポーネントのネスト検証方法リセット方法完全な...
1.Mysqlイメージを取得するdocker pull mysql:5.7 2. MySQLイメージ...
1. イメージをプルするdocker pull registry.cn-hangzhou.aliyu...
ページの主要部分: <body> <ul id="メニュー"&...
HTML は、Baidu 百科事典のナビゲーション ドロップダウン メニュー機能を模倣します。具体的...
目次1. ダウンロード手順2. 環境変数を設定する3. my.iniファイルを設定する4. MySQ...
序文: vue3.0の要素フレームワークを使用します。要素はvue2.0をサポートしており、vue3...
[問題の説明]私たちの実稼働環境には、複数の MySQL サーバー (MySQL 5.6.21) の...
Flash での HTML と CSS の適用:同僚の Den が Flash で HTML と C...
1. 環境の説明(1) CentOS-7-x86_64、カーネルバージョン uname -r は、 ...