MySQL(8.0)でロック状態を確認するには、
SELECT * FROM performance_schema.data_locks; -- もしくは show engine innodb status\G
MySQLでロック状態を確認する
実際に試してみます。
performance_schema.data_locks
paymentテーブルがあるとして、まずは共有ロックを獲得してみます。
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM payment WHERE payment_id = 1 LOCK IN SHARE MODE; +------------+-------------+----------+-----------+--------+---------------------+---------------------+ | payment_id | customer_id | staff_id | rental_id | amount | payment_date | last_update | +------------+-------------+----------+-----------+--------+---------------------+---------------------+ | 1 | 1 | 1 | 76 | 2.99 | 2005-05-25 11:30:37 | 2006-02-15 22:12:30 | +------------+-------------+----------+-----------+--------+---------------------+---------------------+ 1 row in set (0.00 sec)
この状態で冒頭に書いたクエリを実行してみると、共有ロック状態であることが確認できます。
次に、この状態のまま別のトランザクションでSELECTしているレコードに対するUPDATE文を実行し、排他ロックを獲得しようとしてみる。
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE payment SET amount = 50.0 WHERE payment_id = 1;
ロック状態を確認。
最初のトランザクションが共有ロックを獲得しているので、排他ロックのリクエストが待ち状態になっているのが確認できます。
show engine innodb status
BEGIN; SELECT * FROM payment WHERE payment_id = 1 FOR UPDATE; SHOW ENGINE INNODB STATUS\G
実行結果抜粋
payment
テーブルにISロック、レコードに対してSロックがかかっているのが確認できます。
MySQLでロック状態を確認する方法まとめ
次のクエリでMySQL(8.0)でロック状態を確認できる。
SELECT * FROM performance_schema.data_locks;
SHOW ENGINE INNODB STATUS;