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

これはデータベースをロックしますか?

    私には、ドキュメントは少し不明確です:

    内部ロック方法 状況によっては、別のセッションがMyISAMテーブルから読み取っているときにMyISAMテーブルに挿入できることを示唆しています:

    ただし、テーブルロックの問題 は、SELECTが完了するまでテーブルがロックされる状況を示しています(これは状況に適合します):

    InnoDBテーブルは行レベルのロックを実装しているため、テーブル全体ではなく、読み取られている行のみがロックされます。

    ドキュメントだけに頼るのではなく、少しテストしてみました:

    1. 同じ構造の2つのテーブルを作成します:table_a およびtable_b
    2. table_aに入力します 500,000行あります。
    3. table_aからデータをコピーします table_bINSERT INTO ... SELECTを使用する ステートメント。
    4. コピープロセス中に、別のセッションを使用して新しい行をtable_aに挿入します 。
    5. table_bかどうかを確認します 新しいレコードが含まれています。

    両方のテーブルがMyISAMの場合、table_b コピー後の新しいレコードは含まれていませんでした。両方のテーブルがInnoDBの場合、table_b コピー後に新しいレコードが含まれていました。これを3回繰り返しましたが、予想通り、毎回同じ結果になりました。

    つまり、テーブルがMyISAMの場合、テーブルはロックされます。 InnoDBの場合、そうではありません。もちろん、このテストでは更新は考慮されていませんが、結果は同様になると思います。




    1. Spring、Hibernate、Blobの遅延読み込み

    2. MySQL、PostgreSQL、Redis™のScaleGridDigitalOceanサポートが利用可能になりました

    3. 列の値が明確でないすべての行を選択する方法

    4. すでに実行中の64ビットOracleDatabaseServerを実行しているWindowsServerへのOracle32ビットクライアントのインストール