ANSI SQL:2011規格では、分離レベルを次のように定義しています。「SQLトランザクションの分離レベルは、そのSQLトランザクション内のSQLデータまたはスキーマに対する操作が、並列のSQLトランザクション内のSQLデータまたはスキーマに対する操作の影響を受ける程度、およびその操作に影響を与える程度を定義します(<International Standard ISO/IEC 9075-2:2011(E), Part 2: Foundation (SQL/Foundation)、2011>の133ページおよび134ページ)」。分離レベルは、同時実行トランザクション、およびシステムがそれぞれのトランザクションを処理する際にお互いに更新を保護する程度に関する概念です。 また、トランザクションのACIDプロパティの元の定義で使用されている分離の定義(<Teradata Vantage™- SQLリクエストおよびトランザクション処理、B035-1142>を参照)は、逐次化の定義と同義であるため、トランザクションに異なる分離レベルは使用できません。 トランザクションは分離または非分離の任意のです。
この規格は、各トランザクション分離レベルに対して、特性の違う3つの異なる現象を定義しています。これらの現象の定義を以下の表に示します。この表は、ANSI SQL:2011規格(<International Standard ISO/IEC 9075-2:2011(E), Part 2: Foundation (SQL/Foundation)、2011>の134ページおよび135ページ)のリストを引用しています。
現象 | 略語 | 説明 |
---|---|---|
ダーティ読み取り | P1 | トランザクションt1が行を変更します。 t2がCOMMITリクエストを実行する前に、トランザクションt1がその行を読み取ります。 その後、t1がROLLBACKリクエストを実行すると、t2がコミットされなかった行を読み取っています。そのため、その行は存在しなかったと見なされます。 |
反復不可読取り | P2 | トランザクションt1が行を読み取ります。 次に、トランザクションt2がその行を更新または削除し、COMMITリクエストを実行します。 その後、t1がその行を再び読み取ろうとすると、データベースが更新後の値を返すか、または行が削除されている可能性があります。 |
ファントム読み取り | P3 | トランザクションt1は、何らかの検索条件を満たすn行のセットを読み取ります。 次に、トランザクションt2が使用した検索条件を満たす1つ以上の行を生成するSQLリクエストをトランザクションt1が実行します。 その後、トランザクションt1が同じ検索条件を使用して最初の読み取りを繰り返すと、データベースは異なる行セットを返します。 |
以下のテーブル(ANSI規格(<International Standard ISO/IEC 9075-2:2011(E), Part 2: Foundation (SQL/Foundation)、2011>の134ページおよび135ページ)のテーブル8を引用)に、これらの現象の動作がトランザクションの分離レベルに応じてどのように変化するかを示します。
分離レベル | P1 | P2 | P3 |
---|---|---|---|
READ UNCOMMITTED | 可能性あり | 可能性あり | 可能性あり |
SERIALIZABLE | 可能性なし | 可能性なし | 可能性なし |
ANSI SQL:2011規格に含まれているこのテーブルの脚注には、「分離レベルSERIALIZABLEで実行するSQLトランザクションでは、これらの現象は、トランザクションが逐次化であるという要件の場合に排除されます」と記されています。この記述は、意味の重複に近いとはいえ、重要なデータベース トランザクションは常に分離レベルSERIALIZABLEで実行する必要があることを示していると読み取ることが可能で、またそう読み取るべきです。