便利なツールを活用してMySQLのトランザクションを管理する
MySQLでオープンなトランザクションを表示する方法
INFORMATION_SCHEMA.INNODB_TRXテーブルを使用する
MySQL 5.0.17以降では、INFORMATION_SCHEMA.INNODB_TRX
テーブルを使用して、オープンなトランザクションに関する情報を取得できます。このテーブルには、トランザクションID、ステータス、開始時間、待機時間などの情報が含まれています。
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX
WHERE TRX_STATE IN ('ACTIVE', 'PREPARING', 'COMMITTED');
PERFORMANCE_SCHEMA.data_lock_waitsテーブルを使用する
MySQL 5.6以降では、PERFORMANCE_SCHEMA.data_lock_waits
テーブルを使用して、ロック待機中のトランザクションに関する情報を取得できます。このテーブルには、待機しているトランザクションID、ブロックしているトランザクションID、待機しているクエリ、ブロックしているクエリなどの情報が含まれています。
SELECT * FROM PERFORMANCE_SCHEMA.data_lock_waits
WHERE WAIT_EVENT_TYPE = 'trx_lock_wait';
SHOW PROCESSLIST
コマンドを使用して、現在実行中のすべてのスレッドに関する情報を取得できます。この情報には、スレッドID、ユーザー名、実行しているコマンド、ステータスなどの情報が含まれています。オープンなトランザクションは、In_trans
ステータスを持つスレッドとして表示されます。
SHOW PROCESSLIST;
各方法の詳細
INFORMATION_SCHEMA.INNODB_TRX
テーブルは、オープンなトランザクションに関する基本的な情報を取得するのに適しています。PERFORMANCE_SCHEMA.data_lock_waits
テーブルは、ロック待機中のトランザクションに関する詳細情報を取得するのに適しています。SHOW PROCESSLIST
コマンドは、現在実行中のすべてのスレッドに関する情報を取得するのに適しており、オープンなトランザクションを特定するのにも使用できます。
補足
- オープンなトランザクションは、長い時間放置すると、パフォーマンスの問題を引き起こす可能性があります。定期的にオープンなトランザクションを監視し、必要に応じてコミットまたはロールバックすることが重要です。
- 上記の方法は、InnoDBストレージエンジンを使用するMySQLサーバーにのみ適用されます。
この情報は参考目的のみであり、いかなる保証もありません。データベースの操作を行う前に、必ずバックアップを取ってください。
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX
WHERE TRX_STATE IN ('ACTIVE', 'PREPARING', 'COMMITTED');
SELECT * FROM PERFORMANCE_SCHEMA.data_lock_waits
WHERE WAIT_EVENT_TYPE = 'trx_lock_wait';
SHOW PROCESSLISTコマンドを使用する
SHOW PROCESSLIST;
説明
- 上記のコードは、MySQL 5.7.34で実行されています。
INFORMATION_SCHEMA.INNODB_TRX
テーブルとPERFORMANCE_SCHEMA.data_lock_waits
テーブルは、MySQL 5.0.17以降で使用できます。SHOW PROCESSLIST
コマンドは、MySQL 5.0以降で使用できます。
実行方法
- MySQLクライアントに接続します。
- 上記のコードをコピーして、MySQLクライアントに貼り付けます。
- Enterキーを押します。
出力例
TRX_ID TRX_STATE TRX_ISOLATION_LEVEL TRX_MODE XA_STATE
-------- ------------ ---------------------- -------------- ---------
10 ACTIVE REPEATABLE READ DEFAULT NOT XA
12 PREPARED REPEATABLE READ DEFAULT NOT XA
15 COMMITTED REPEATABLE READ DEFAULT NOT XA
THREAD_ID LOCK_TABLE_ID LOCK_ID OBJECT_SCHEMA OBJECT_NAME OBJECT_TYPE WAIT_DURATION WAIT_EVENT_TYPE
------------ -------------- ------------ ------------- ---------- -------- ------------ -----------
10 550256 3365504 account account TABLE 200.000000 trx_lock_wait
12 550257 3365505 account account TABLE 0.000000 trx_lock_wait
15 550258 3365506 account account TABLE 0.000000 trx_lock_wait
Id User Host db Command State Info
10 root localhost test SHOW PROCESSLIST Waiting for lock release
12 root localhost test BEGIN; UPDATE account SET balance = balance - 100 WHERE id = 1; In_trans
15 root localhost test COMMIT; In_trans
注記
- 上記の出力例はあくまでも一例です。実際に出力される内容は、システム環境や実行タイミングによって異なります。
MySQLでオープンなトランザクションを表示するその他の方法
mysqldb コマンドを使用する
mysqldb
コマンドは、MySQLサーバーと対話するためのコマンドラインツールです。このツールを使用して、innodb_trx
テーブルにクエリを実行し、オープンなトランザクションに関する情報を取得できます。
mysqldb -u username -p password -e "SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TRX_STATE IN ('ACTIVE', 'PREPARING', 'COMMITTED');"
MySQL Workbenchは、MySQLを管理するためのグラフィカルツールです。このツールを使用して、INFORMATION_SCHEMA.INNODB_TRX
テーブルをブラウズし、オープンなトランザクションに関する情報を取得できます。
- MySQL Workbenchを起動します。
- データベース接続を確立します。
- ナビゲーターペインで、
INFORMATION_SCHEMA
データベースを展開します。 - INNODB_TRXテーブルを右クリックし、表示を選択します。
- フィルタータブで、
TRX_STATE
列にACTIVE
、PREPARING
、またはCOMMITTED
を入力します。 - 実行をクリックします。
- HeidiSQLを起動します。
mysql sql database