12
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
12
Help us understand the problem. What are the problem?