sql >> データベース >  >> RDS >> Mysql

InnoDBテーブルをロックして、そのテーブルのコピー中に更新されないようにするにはどうすればよいですか?

    長い回答で申し訳ありませんが、これは複数の部分で回答する必要があります。

    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つのテーブルのアトミックスワップが実行されます。




    1. MySQL:複数のスレッドにわたるトランザクション

    2. PostgreSQLbytea列の16進数をrのint16/uint16にデコードする方法は?

    3. データモデリングにおけるERD表記

    4. スタートアップスクリプトをmysqldockerコンテナに追加するにはどうすればよいですか?