トランザクションエンジン(通常はInnodb)を使用していると仮定して、同じトランザクションでテーブルをクリアして補充します。
リーダーがREAD_COMMITTED以上のトランザクション分離レベルを使用していることを確認してください(デフォルトはREPEATABLE READで、これより高い値です)。
そうすれば、読者は更新中にテーブルの古い内容を引き続き読み取ることができます。
注意すべき点がいくつかあります:
- テーブルが大きすぎてロールバック領域を使い果たした場合-これは、(たとえば)1M行のテーブル全体を更新すると可能になります。もちろん、これは調整可能ですが、制限があります
- トランザクションが途中で失敗してロールバックされた場合-大きなトランザクションのロールバックはInnoDBでは非常に非効率的です(ロールバックではなくコミット用に最適化されています)
- デッドロックとロック待機のタイムアウトに注意してください。これらは、大きなトランザクションを使用する場合に発生する可能性が高くなります。