LoginSignup
13
17

More than 3 years have passed since last update.

MySQLのLOCK TABLESとは?何をしているのか

Last updated at Posted at 2019-07-22

SQLクライアントツールなどでdumpを取得した場合、
テーブルに対してlock tableという指定がされます。
ロックが何をしているかの調査結果メモです。

LOCK TABLESとは

MySQLのクライアントセッションは、他のセッションと連携してテーブルアクセスする際に、
排他的制御をする場合、他のセッションにテーブルを更新されないように明示的にロックをかけることができます。
これがlock tablesの指定になります。
select for updateの指定と類似ですね。
dump時は他のセッションとデータの不整合を発生させないために明示的にロックを指定されているようです。

コマンドはこちらです。

LOCK TABLES {tbl_name}
    READ | WRITE

ロックの種類は

READロック

  • このロックを保持しているセッションは、テーブルを読み取ることができます
    (書き込みはできません)

  • 複数のセッションが同時にテーブルに対する READ ロックを取得できます

  • ほかのセッションは、READ ロックを明示的に取得することなく、テーブルを読み取ることができます

ちなみにロックが必要なセッションは1つのステートメントで全て指定することが必要です。
なので、例えば

1). > LOCK TABLES test1 READ;
2). > SELECT * FROM test1;
3). > SELECT * FROM test2;

2はロックを指定しているのでtest1にアクセスできますが
3はtest2へのロックを取得していないのでアクセスできません。
この場合、test2へのロックを指定するか一度unlockする必要があります。

※他のセッションからはアクセスできます。
※INFORMATION_SCHEMAへのアクセスは例外です。ロック関係なくアクセス可能です。

WRITEロック

  • このロックを保持しているセッションは、テーブルの読み取りおよび書き込みが可能です

  • このロックを保持しているセッションだけがテーブルにアクセスできます。ロックが解放されるまで、ほかのどのセッションもアクセスできません

  • WRITE ロックが保持されている間、テーブルに対するほかのセッションからのロック要求はブロックされます

セッション解放

ロックのセッションを解放する場合は

UNLOCK TABLES

を使用します。テーブル名指定不要。

参照:https://dev.mysql.com/doc/refman/5.6/ja/lock-tables.html

13
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
17