テーブルロックは最も基本的なロック戦略であり、テーブル全体をロックし、任意の時点で同一テーブルに対する読み書き操作を1つのセッションのみが許可します。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を参照してください。