データベース・SQL

MySQLでロック状態を確認する方法

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;

-データベース・SQL

© 2021 フリエン生活 Powered by AFFINGER5