次のような 2 つのテーブルを考えてみましょう。
TABLE: current
-------------------
| id | dept | value |
|----|------|-------|
| 4| A | 20 |
| 5| B | 15 |
| 6| A | 25 |
-------------------
TABLE: history
-------------------
| id | dept | value |
|----|------|-------|
| 1| A | 10 |
| 2| C | 10 |
| 3| B | 20 |
-------------------
これらは単純な例にすぎません...実際のシステムでは、両方のテーブルにかなり多くの列と行があります (現在の行は 10,000 行以上、履歴は 100 万行以上)。
クライアント アプリケーションは継続的に (1 秒間に数回) 新しい行を現在のテーブルに挿入し、古い既存の行を現在のテーブルから履歴に "移動" します (1 回のトランザクション内での削除/挿入)。
このアクティビティでクライアントをブロックすることなく、2 つのテーブル全体で部門ごとの値の一貫した合計を取得する必要があります。
トランザクション分離レベルを REPEATABLE READ に設定すると、次のことができます。
SELECT dept, sum(value) FROM current GROUP BY dept;
に続く
SELECT dept, sum(value) FROM history GROUP BY dept;
2 つの結果セットを合計します。しかし、各クエリはそれぞれのテーブルへの挿入をブロックします。
分離レベルを READ COMMITTED に変更し、同じ 2 つの SQL を実行すると、挿入のブロックを回避できますが、クエリ中に現在のエントリから履歴に移動すると、エントリが二重にカウントされるリスクがあります (各 SELECT が独自のスナップショットを作成するため)。
ここに質問があります....UNIONを実行すると、分離レベルREAD COMMITTEDで何が起こりますか:
SELECT dept, sum(value) FROM current GROUP BY dept
UNION ALL
SELECT dept, sum(value) FROM history GROUP BY dept;
MySQL は両方のテーブルの一貫したスナップショットを同時に生成しますか (それにより二重カウントのリスクを取り除きます)、それとも最初に 1 つのテーブルのスナップショットを取得し、しばらくしてから 2 番目のテーブルのスナップショットを取得しますか?