MySQL
このほか、
今回は、
MySQL 8.0での調査方法
まずは、
data_
テーブルlocks data_
テーブルは行ロックを保持している、locks または行ロックを取得しようと待機している状態を確認できます。 data_
テーブルlock_ waits data_
テーブルは行ロックを待機している状態を確認できます。スレッド間の行ロックの依存関係を把握することができます。lock_ waits
ロックの状態確認方法
それでは、data_
テーブルからどのように行ロックの状態が確認できるか、
テーブル準備
テーブルを用意して1行を追加します。
mysql> CREATE TABLE `i` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `id2` int DEFAULT NULL, `t` varchar(255) DEFAULT NULL, PRIMARY KEY `id` (`id`), KEY `id2` (`id2`) ) ENGINE=InnoDB; mysql> INSERT INTO i (id2,t) VALUES (1000,'test');
ロックするSQLを実行
ここで、SELECT .. FOR UPDATE
にて、
mysql> BEGIN; mysql> SELECT * FROM i WHERE id2=1000 FOR UPDATE; +----+------+------+ | id | id2 | t | +----+------+------+ | 1 | 1000 | test | +----+------+------+ 1 row in set (0.00 sec)
ここでdata_
テーブルを確認してみます。各行が1つのロックを表します。また、
mysql> SELECT THREAD_ID,EVENT_ID,OBJECT_NAME,INDEX_NAME,LOCK_TYPE,LOCK_MODE,LOCK_STATUS,LOCK_DATA from data_locks; +-----------+----------+-------------+------------+-----------+---------------+-------------+------------------------+ | THREAD_ID | EVENT_ID | OBJECT_NAME | INDEX_NAME | LOCK_TYPE | LOCK_MODE | LOCK_STATUS | LOCK_DATA | +-----------+----------+-------------+------------+-----------+---------------+-------------+------------------------+ Row1 | 9481 | 48 | i | NULL | TABLE | IX | GRANTED | NULL | Row2 | 9481 | 48 | i | id2 | RECORD | X | GRANTED | supremum pseudo-record | Row3 | 9481 | 48 | i | id2 | RECORD | X | GRANTED | 1000, 1 | Row4 | 9481 | 48 | i | PRIMARY | RECORD | X,REC_NOT_GAP | GRANTED | 1 | +-----------+----------+-------------+------------+-----------+---------------+-------------+------------------------+
それぞれのカラムについて説明します。
THREAD_ID
ロックしたスレッドID。1つのセッションに1つのスレッドIDが発行されます。9481は、
自身のスレッドIDを確認するには以下SQLを実行します。
SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=connection_id();
EVENT_ID
ロックしたイベントID。スレッドのイベント番号です。
OBJECT_NAME
ロックされたテーブル名。
INDEX_NAME
ロックされたインデックス名。
LOCK_TYPE
ロックのタイプ。TABLE
はテーブルロック、RECORD
は行ロックです。
LOCK_MODE
ロックのモード。InnoDBの行ロックでは排他
- Xは排他ネクストキーロック
- S,REC_
NOT_ GAPは共有レコードロック - X,GAPは排他ギャップロック
今回は行ロックの確認方法なのでギャップロックやネクストキーロックの詳細については説明しません。くわしくは 15.
LOCK_STATUS
ロックの状態。GRANTED
はロック保持、WAITING
はロックを取得できず待機している状態です。
LOCK_DATA
ロックを取得した行の値が表示されます。プライマリキーであれば、
各行の詳細
今回は行が4つであることから4つの種類のロックを取得しています。また、
Row1
LOCK_
Row2
id2インデックス
Row3
Row2と同じくid2インデックス
Row4
id2インデックス
まとめ
MySQL 8.
次回は、data_
テーブルについてや、