トランザクション分離レベル
Microsoft SQL Server 2005 Compact Edition (SQL Server Compact Edition) は、既定では Read Committed の分離レベルで動作します。ただし、アプリケーションによっては、別の分離レベルで動作する必要があります。アプリケーションで別の分離レベルを実装するには、SET TRANSACTION ISOLATION LEVEL ステートメントを使用してセッションの分離レベルを設定し、セッション全体のロックをカスタマイズできます。
重要 : |
---|
SQL Server Compact Edition の既定の分離レベルは Read Committed ですが、この分離レベルを使用すると、データの読み取り時に S ロックは設定されません。この動作は Microsoft SQL Server と異なります。SQL Server では、Read Committed を使用すると行が読み取られるたびに S ロックが要求され、その行に競合するロックが発生した場合は読み取り操作は待機状態になります。一方 SQL Server Compact Edition では、データ ページのバージョンが自動的に管理されるので、データをロックしなくてもコミット済みのデータを読み取ることができ、S ロックは必要ありません。つまり、SQL Server Compact Edition では SELECT 操作でデータをロックする必要がなく、SELECT 操作はほぼ確実に成功します。SQL Server とは異なり、SELECT 操作は一部のデータに X ロックが設定されていても待機状態になりません。それでも SELECT 操作の際には、Sch-S ロックが必要です。テーブルの変更中には競合する Sch-X ロックが存在するため、テーブルの変更中にのみ SELECT 操作は失敗します。 |
分離レベルを指定した場合は、SQL Server Compact Edition セッション内のすべての SELECT ステートメントのロック動作は指定した分離レベルで行われ、セッションが終了するか分離レベルが変更されるまで継続します。たとえば、トランザクション分離レベルを Serializable に設定し、同時実行トランザクションにより Employee テーブルにファントム行が挿入されないようにするには、次の SQL ステートメントを使用します。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT EmployeeID FROM Employee;
また、プログラムでトランザクション分離レベルを設定することもできます。次に、ADO .NET を使用して、トランザクション分離レベルを設定する方法の例を示します。
SqlTransaction myTrans;
myTrans = myConnection.BeginTransaction(IsolationLevel.RepeatableRead);
参照
概念
ロックについて
ロックに関する情報の表示
ロック ヒント (SQL Server Compact Edition)
ロック タイムアウト