分離レベル

トランザクション制御メカニズムとしてロックを使用すると、同時実行の問題を解決できます。つまり、複数のトランザクションが存在する場合でも、すべてのトランザクションを互いに完全に分離したトランザクションとして同時に実行できます。トランザクションが一貫性のないデータを受け入れるレベルを分離レベルといいます。分離レベルを高くすれば、データの一貫性が損なわれるのを回避できますが、代わりに同時実行性が低下します。

SQL Server Compact では、アプリケーションに必要な分離レベルによって、SQL Server Compact で使用されるロック動作が決まります。

SQL Server Compact は、以下の分離レベルをサポートしています (分離レベルの低い順に記述)。

  • Read Committed (SQL Server Compact の既定値)

  • Repeatable Read

  • Serializable (トランザクションは互いに完全に分離されます)

分離レベルが高くなるにつれて、データは一貫性の損失から保護される度合いが高くなります。ただし、トランザクションの同時実行性が低くなるので、マルチユーザー アクセスに影響します。

注意

SQL Server Compact では、1 つのトランザクションでデータをまだコミットしていない場合、他のトランザクションでそのデータを読み取ること (ダーティ リード) はできません。ここでは、ページ バージョン管理メカニズムを使用することにより、ユーザーが S ロックを要求しなくてもデータを読み取れるようになっています。このメカニズムでは、読み取り (SELECT) 操作の例外的な同時実行が提供されます。

分離レベルと同時実行の問題

次の表は、分離レベルとそのレベルで解決される同時実行の問題の一覧です。

注意

発生する可能性のある同時実行の問題には、非コミット依存、不一致分析、およびファントム読み取りがあります。同時実行の問題の詳細については、「同時実行」を参照してください。

分離レベル

非コミット依存 (ダーティ リード)

不一致分析 (反復不能読み取り)

ファントム読み取り

Read Committed

×

Repeatable Read

×

×

Serializable

×

×

×

分離レベルは、プログラム、または SQL 構文 SET TRANSACTION ISOLATION LEVEL を使用して設定できます。詳細については、「トランザクション分離レベル」を参照してください。

トランザクション スコープにおける分離レベル

System.Transaction の既定の分離レベルは ReadCommitted です。しかし既定では、トランザクション スコープ内のトランザクション実行時に、分離レベルは Serializable に設定されます。したがって、SQL Server Compact 接続がトランザクション スコープに参加している場合、暗黙のトランザクション (トランザクション スコープ内で作成された SQL Server Compact トランザクション) は、既定で Serializable 分離レベルで実行されます。TransactionScope クラスのオーバーロードされたコンストラクターの一部は、パラメーターとして分離レベルを受け取ります。暗黙のトランザクションに異なる分離レベルを指定するには、これらのコンストラクターを使用します。指定された分離レベルが SQL Server Compact でサポートされていない場合、SQL Server Compact 接続をトランザクション スコープに参加させると例外がスローされます。

また、接続文字列の一部として default lock timeout プロパティを指定すると、トランザクションが待機する時間を制御できます。ただし、接続が TransactionScope に参加している場合、TransactionScope の TimeSpan がこのプロパティに優先して適用されます。たとえば、ConnectionString に default lock timeout の値として 1000 ミリ秒が指定されており、100 ミリ秒が指定された TransactionScope に接続が参加している場合、関連するトランザクションは 1000 ミリ秒ではなく 100 ミリ秒までしか実行されません。つまり、アプリケーション実行時のトランザクションのタイムアウト時間をより長くして、その間 TransactionScope でコマンドを実行するには、接続文字列と TransactionScope の TimeSpan の両方にタイムアウト時間の値を指定する必要があります。

注意

default lock timeout の既定値は 2000 ミリ秒で、TransactionScope の既定値は 1 分です。

関連項目

概念

トランザクション (SQL Server Compact)

ロック (SQL Server Compact)

カーソル (SQL Server Compact)