前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション 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 サービスを確立して分析する手順
コンポーネントに背景画像コントロールを追加するには、次の 2 つの手順だけが必要です。 <表示...
この記事の例では、ページ切り替え効果を実現するためのJSコードの具体的なコードを参考までに共有してい...
ケース1: 最後の提出とプッシュなし次のコマンドを実行します。 git コミット --amend g...
HTTP/1.1 プロトコルで指定されている HTTP リクエスト メソッドには、OPTIONS、...
インデックスとは何ですか?インデックスは、データベース ストレージ エンジンが指定されたデータをすば...
Linux で MySQL-5.7.19 バージョンをインストールするための最初のチュートリアル。す...
この記事では、ログイン認証コードを実装するためのvue+springbootの具体的なコードを例とし...
まずコードファイルの構造を見てみましょう。エントリファイル (index1.js) の内容: ...
目次1. 計画タスクをカスタマイズする2. 時間を同期する3. 練習する4. セキュリティの問題1....
序文最近、小さなデモを作成しました。大規模な工場のオンライン データを使用したため、インターフェイス...
ページが非常に長い場合は、下にさらにコンテンツがあることをユーザーに知らせるために矢印が必要になるこ...
目次執筆の背景プロジェクトの説明事前準備注記執筆の背景以前のプロジェクトではTencent Maps...
来学期にMySQLを勉強します。事前に自宅で練習していませんでした。インストールに時間がかかるとは思...
第 1 章<br /> Web ページをユーザーにとって使いやすいものにするための最も重...
SEO とセキュリティを考慮して、301 リダイレクトが必要です。以下の一般的な処理には Nginx...