長い回答で申し訳ありませんが、これは複数の部分で回答する必要があります。
1。 LOCK TABLES
を使用してInnoDBテーブルをロックする場合 一般的に
LOCK TABLES
の使用 InnoDBを使用すると、実際に機能し、同じサーバーに接続されたMySQL CLIの2つのインスタンス( mysql-1
で示される)でデモンストレーションできます。 およびmysql-2
)以下の例では。クライアントへの影響があるため、通常、あらゆる種類の本番環境では回避する必要がありますが、それが唯一の選択肢となる場合もあります。
テーブルを作成し、データを入力します:
mysql-1> create table a (id int not null primary key) engine=innodb;
Query OK, 0 rows affected (0.02 sec)
mysql-1> insert into a (id) values (1), (2), (3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
テーブルをロックする:
mysql-1> lock tables a write;
Query OK, 0 rows affected (0.00 sec)
mysql-2
から挿入してみてください 、ロックを待ってハングアップします:
mysql-2> insert into a (id) values (4);
次に、 mysql-1
からテーブルのロックを解除します :
mysql-1> unlock tables;
Query OK, 0 rows affected (0.00 sec)
そして最後にmysql-2
ブロックを解除して返します:
Query OK, 1 row affected (6.30 sec)
2。テストにphpMyAdminを使用する
phpMyAdminは、Webインターフェイスからのクエリ間でサーバーへの永続的な接続を維持しないため、phpMyAdminを使用したテスト方法は無効です。あらゆる種類のロックを使用するためにLOCKTABLES
、 START TRANSACTION
、など、ロックが保持されている間は接続を維持する必要があります。
3。作業中に必要なすべてのテーブルをロックする
LOCK TABLES
を使用した後、MySQLがテーブルをロックする方法 何かを明示的にロックするために、 LOCK
の間に明示的にロックされなかった他のテーブルにアクセスすることはできません。 ...ロック解除コード> セッション。上記の例では、次を使用する必要があります:
LOCK TABLES my_table WRITE, new_table WRITE, table2 READ;
(私は table2
を想定しています 副選択で使用されたのはタイプミスではありませんでした。)
4。 RENAME TABLE
を使用したアトミックテーブルスワップ
さらに、 DROP TABLE
を使用して既存のテーブルを置き換えることに注意する必要があります 続いてRENAMETABLE
テーブルが存在しない瞬間が発生し、テーブルが存在することを期待しているクライアントを混乱させる可能性があります。一般的には、次のことを行う方がはるかに優れています。
CREATE TABLE t_new (...);
<Populate t_new using some method>
RENAME TABLE t TO t_old, t_new TO t;
DROP TABLE t_old;
これにより、2つのテーブルのアトミックスワップが実行されます。