テーブルロックは最も基本的なロック戦略であり、テーブル全体をロックし、任意の時点で同一のテーブルに対して読み書き操作を行えるのは一つのセッションのみです。LOCK TABLES ステートメントを使用してテーブルをロックできます。
データベースは複数のユーザーが共有するリソースです。複数のユーザーが同時にデータにアクセスすると、データベース内では複数のトランザクションが同一のデータに同時にアクセスする状況が発生します。並行操作を制御しない場合、誤ったデータの読み取りや保存が行われ、データベースの一貫性が損なわれる可能性があります。ロックは、データベースの並行制御を実現するための非常に重要な技術です。リソースの安全性(すなわちデータの完全性と一貫性)を確保するためにロック機構が導入されました。このロック機構を利用して、トランザクション間のデータの並行アクセスおよびデータの一貫性を実現します。
前提条件
ロックするテーブルは、ユーザー自身の Schema 内に存在するか、またはユーザーは LOCK TABLES 権限を持っている必要があります。
手順例
test1 テーブルに読み取りロックを設定し、test2 テーブルに書き込みロックを設定します。
obclient> LOCK TABLES test1 as t1 READ LOCAL, test2 as t2 LOW_PRIORITY WRITE;
Query OK, 0 row affected
- テーブルを読み取り専用モードでロックすると、そのテーブルは
SELECTのみ可能で、変更はできません。テーブルをロックする際にそのテーブル上にトランザクションが存在する場合、LOCKステートメントはトランザクションが終了するまで待機します。複数のセッションが同時にテーブルに対してこの操作を実行できます。 - テーブルを読み書きモードでロックすると、
LOCK TABLEを実行したセッションはテーブルに対する変更やクエリなどの操作を行えますが、他のセッションはそのテーブルに対してSELECTでさえも一切の操作を行うことができません。
LOCK TABLES ステートメントの詳細については、LOCK TABLESを参照してください。