2016-04-07 8 views
10

MySQL経由でテーブルを読み込み、次のエラーが表示されますか?MySQL - テーブル 'my_table'がロックテーブルでロックされていません

MySQLは言った:テーブル 'CMSを' テーブルをロックする必要がないのはなぜLOCK TABLESを

でロックされていませんでしたか?私はこれを前に見たことがありませんか?ロックを解除する方法はありますか?あなたもしたいですか?

答えて

9

http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html

MySQLはテーブルへのアクセスのために他のセッションとの協力の目的は、 または期間中のテーブルを変更することから、他のセッションを防ぐためには、 セッションが必要とするとき に対して明示的にテーブル・ロックを取得するためのクライアント・セッションを可能にしますそれらへの排他的なアクセス。セッションは、自身のロックを解除するか、または を取得できます。 1つのセッションで別のセッションのロックを取得できません。

テーブルを更新すると、ロックを使用してトランザクションをエミュレートしたり、速度を向上させることができます。詳細については、 セクションの後半で詳しく説明します。

LOCK TABLESは、現在のクライアント セッションのテーブルロックを明示的に取得します。ベーステーブルまたはビューに対してテーブルロックを取得できます。 にはLOCK TABLES権限が必要で、各 オブジェクトのSELECT権限がロックされている必要があります。

ビューロックの場合、LOCK TABLESは、ビューで使用されるすべてのベーステーブルを に追加して、ロックするテーブルのセットを自動的にロックします。 テーブルをLOCK TABLESで明示的にロックすると、第13.3.5.2項「LOCK TABLESおよびトリガー」で説明されているように、 トリガーで使用されるすべての表も暗黙的にロックされます。

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

UNLOCK TABLESのための別の用途では、すべてのデータベース内のすべてのテーブルをロックすることができます READ LOCK文、WITH FLUSH TABLESを用いて取得グローバルリードロック を解放することです。第13.7.6.3項「FLUSH 構文」を参照してください。 LOCKため

構文(これは、あなたが時間内にスナップショットを取ることができVeritasなど ファイルシステムを持っている場合は、バックアップを取得するには非常に便利な方法です)と

LOCK TABLES 
    tbl_name [[AS] alias] lock_type 
    [, tbl_name [[AS] alias] lock_type] ... 

lock_type: 
    READ [LOCAL] 
    | [LOW_PRIORITY] WRITE 

例えばUNLOCK: -

LOCK TABLE t WRITE, t AS t1 READ; 

ロック解除テーブル

UNLOCK TABLES 
6

私のための解決策は、テーブルのロックを解除することでした。彼らはunlock tablesステートメントに達する前に失敗した以前のクエリによってロックされていました。

UNLOCK TABLES 
SELECT ... 
0

私はこの問題が発生しました:

LOCK TABLE <table_a> READ; 
LOCK TABLE <table_b> READ; 
LOCK TABLE <table_a> WRITE; 
LOCK TABLE <table_b> WRITE; 

その後、私は、これはTable 'table_a' was not locked with Lock Tablesを発生させ、から読み取ります。

documentationを読んだ後、私はにロックコードを修正する:これは私のために問題を解決

LOCK TABLE <table_a> WRITE, <table_b> WRITE 

lock type

READ読み取りロックは、何の書き込みは

WRITE排他的な書き込みロックを許可されません。他の接続はこのテーブルを読み書きできません

関連する問題