テーブルのロックとテーブルのロック解除

TiDB を使用すると、クライアント セッションがテーブルにアクセスするために他のセッションと連携したり、他のセッションによるテーブルの変更を防止したりする目的でテーブル ロックを取得できるようになります。セッションは、それ自体に対してのみロックを取得または解放できます。あるセッションが別のセッションのロックを取得したり、別のセッションが保持しているロックを解放したりすることはできません。

LOCK TABLES現在のクライアント セッションのテーブル ロックを取得します。ロックする各オブジェクトに対してLOCK TABLESおよびSELECT権限を持っている場合は、共通テーブルのテーブル ロックを取得できます。

UNLOCK TABLES現在のセッションが保持しているテーブル ロックを明示的に解放します。 LOCK TABLES新しいロックを取得する前に、現在のセッションによって保持されているすべてのテーブル ロックを暗黙的に解放します。

テーブル ロックは、他のセッションによる読み取りまたは書き込みから保護します。 WRITEロックを保持するセッションは、 DROP TABLETRUNCATE TABLEなどのテーブルレベルの操作を実行できます。

ノート:

テーブル ロック機能はデフォルトでは無効になっています。

  • TiDB セルフホストの場合、テーブル ロック機能を有効にするには、すべての TiDB インスタンスの構成ファイルでenable-table-locktrueを設定する必要があります。
  • TiDB Cloudの場合、テーブル ロック機能を有効にするには、 TiDB Cloudのサポートに連絡してenable-table-locktrueに設定する必要があります。

あらすじ

LockTablesDef
LOCKTABLESTABLETableNameLockType,TableNameLockType
UnlockTablesDef
UNLOCKTABLES
LockType
READLOCALWRITELOCAL

テーブルロックの取得

LOCK TABLESステートメントを使用すると、現在のセッション内でテーブル ロックを取得できます。次のロック タイプが利用可能です。

READロック:

  • このロックを保持しているセッションはテーブルを読み取ることはできますが、書き込むことはできません。
  • 複数のセッションが同じテーブルから同時にREADロックを取得できます。
  • 他のセッションは、明示的にREADロックを取得しなくてもテーブルを読み取ることができます。

READ LOCALロックは MySQL との構文互換性のみを目的としており、サポートされていません。

WRITEロック:

  • このロックを保持するセッションは、テーブルの読み取りと書き込みができます。
  • このロックを保持しているセッションのみがテーブルにアクセスできます。ロックが解放されるまで、他のセッションはアクセスできません。

WRITE LOCALロック:

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

LOCK TABLESステートメントに必要なロックが別のセッションによって保持されている場合、 LOCK TABLESステートメントは待機する必要があり、このステートメントの実行時にエラーが返されます。次に例を示します。

> LOCK TABLES t1 READ; ERROR 8020 (HY000): Table 't1' was locked in WRITE by server: f4799bcb-cad7-4285-8a6d-23d3555173f1_session: 2199023255959

前述のエラー メッセージは、TiDB f4799bcb-cad7-4285-8a6d-23d3555173f1の ID 2199023255959のセッションがテーブルt1に対してすでにWRITEロックを保持していることを示しています。したがって、現在のセッションはテーブルt1READロックを取得できません。

1 つのLOCK TABLESステートメントで同じテーブル ロックを複数回取得することはできません。

> LOCK TABLES t WRITE, t READ; ERROR 1066 (42000): Not unique table/alias: 't'

テーブルのロックを解除する

セッションによって保持されているテーブル ロックが解放されると、それらはすべて同時に解放されます。セッションは、明示的または暗黙的にロックを解放できます。

  • セッションはUNLOCK TABLESを使用して明示的にロックを解放できます。
  • セッションがすでにロックを保持しているときにLOCK TABLESステートメントを発行してロックを取得すると、新しいロックが取得される前に、既存のロックが暗黙的に解放されます。

クライアント セッションの接続が終了すると、正常か異常かに関係なく、TiDB はセッションによって保持されているすべてのテーブル ロックを暗黙的に解放します。クライアントが再接続すると、ロックは無効になります。このため、クライアントで自動再接続を有効にすることはお勧めできません。自動再接続を有効にすると、再接続が発生したときにクライアントに通知されず、すべてのテーブル ロックまたは現在のトランザクションが失われます。対照的に、自動再接続が無効になっている場合、接続が切断されると、次のステートメントの発行時にエラーが発生します。クライアントはエラーを検出し、ロックの再取得やトランザクションのやり直しなどの適切なアクションを実行できます。

テーブルロックの制限と条件

KILLを使用すると、テーブル ロックを保持しているセッションを安全に終了できます。

次のデータベースのテーブルではテーブル ロックを取得できません。

  • INFORMATION_SCHEMA
  • PERFORMANCE_SCHEMA
  • METRICS_SCHEMA
  • mysql

MySQLの互換性

テーブルロックの取得

  • TiDB では、セッション A がすでにテーブル ロックを保持している場合、セッション B がテーブルに書き込もうとするとエラーが返されます。 MySQL では、セッション B の書き込みリクエストは、セッション A がテーブル ロックを解放するまでブロックされ、他のセッションからのテーブル ロックのリクエストは、現在のセッションがロックWRITEを解放するまでブロックされます。
  • TiDB では、 LOCK TABLESステートメントが必要とするロックが別のセッションによって保持されている場合、 LOCK TABLESステートメントは待機する必要があり、このステートメントの実行時にエラーが返されます。 MySQL では、このステートメントはロックが取得されるまでブロックされます。
  • TiDB では、 LOCK TABLESステートメントはクラスター全体で有効です。 MySQL では、このステートメントは現在の MySQLサーバーでのみ有効であり、NDB クラスターとは互換性がありません。

テーブルロック解除

トランザクションが TiDB セッションで明示的に開始された場合 (たとえば、 BEGINステートメントを使用して)、TiDB はセッションによって保持されているテーブル ロックを暗黙的に解放しません。ただし、MySQL は可能です。

このページは役に立ちましたか?