3

I understand the examples given for "dirty reads" and "phantom reads" on the wikipedia page for isolation levels. However I'm not sure how to categorise the following situation and what isolation level or different strategy to apply in order to avoid this situation.

  1. Transaction 1: Inserts row in table A
  2. Transaction 2: Selects row in table A
  3. Transaction 2: Selects row in table B based on something in the previous read
  4. Transaction 2: Commit
  5. Transaction 1: Inserts row in table B
  6. Transaction 1: Commit

問題は、T1 が両方のテーブルへの書き込みを完了する前に、トランザクション 2 が B で何かを選択することです。手順 3 の選択では、5 で挿入された行を正しく選択する必要がある場合があります。これは、ダーティ リードか、ファントム リードか、どちらでもないか。問題を回避するには、READ_COMMITTED 分離レベルで十分でしょうか? 私が理解しているように、READ_COMMITTEDを使用すると、T2はその時点でT1によって挿入された新しい行を読み取るべきではありません。

4

1 に答える 1

1

これはダーティ リードです。分離レベルではREAD_COMMITTED、ステップ 2 のクエリは、ステップ 1 で挿入したまだコミットしていない行を返さないため、まだ挿入されていないデータへのアクセス試行の失敗を防ぐことができます。

ファントム読み取りは、トランザクション 2 内で同じクエリを 2 回実行し、異なる結果セットを取得していることを意味します。

于 2012-09-18T13:48:57.507 に答える