データベース・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;

イチオシ記事

1

自己紹介 フリーランスエンジニアをしているヨノと申します。 独学でプログラミングを学び、ソシャゲ・SaaS開発などを経て、2018年からフリーランスエンジニアとして活動しています。 主にバックエンド中 ...

2

はじめまして、フリーランスエンジニアのヨノと申します。 自己紹介 独学でプログラミングを学び、ソシャゲ・SaaS開発などを経て、2018年からフリーランスエンジニアとして活動しています。 主にバックエ ...

3

ネット上で色々言われているフリーランスエンジニア....。「本当はどうなの?」と思っている人は多いでしょう。 そこで本記事ではフリーランスエンジニア5年生の私が、ネット上の意見も引用しながら実態を解説 ...

-データベース・SQL