私は、ADO.NETベースのWebサイトを構築するチームの一員です。データベースの開発コピーを同時に動作させる複数の開発者と自動テストツールが存在する場合があります。
スナップショット分離レベルを使用します。これは、私の知る限り、楽観的同時実行性を使用します。ロックするのではなく、影響を受ける行が他のパーティによって変更された場合にトランザクションをコミットしようとすると、最高のものを期待して例外をスローします。トランザクション。
スナップショット分離レベルを使用するには、次を使用します。
ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;
およびC#の場合:
Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot);
IsolationLevelスナップショットは、私たちも試したが現在使用していないReadCommittedスナップショットと同じではないことに注意してください。
開発者の1人がデバッグモードに入り、.NETアプリを一時停止すると、開発者はデバッグ中にアクティブなトランザクションとの接続を保持します。さて、これは問題ではないと思います-結局のところ、すべてのトランザクションはスナップショット分離レベルを使用しているので、一時停止されたトランザクションはロックを保持していないため、1つのトランザクションが一時停止されている間、他のトランザクションは正常に続行できるはずです。もちろん、一時停止されたトランザクションが完了すると、競合が検出される可能性があります。しかし、他の開発者や自動テストが妨げられることなく続行できる限り、それは許容されます。
ただし、実際には、デバッグ中に1人のユーザーがトランザクションを停止すると、スナップショット分離レベルを使用しているにもかかわらず、同じ行にアクセスしようとする他のすべてのDBユーザーがブロックされます。
なぜこれが発生するのか、および/または真の楽観的(非ブロッキング)並行性を実現する方法を誰かが知っていますか?
決議(私にとっては残念なことです):Remus Rusanuは、作家は常に他の作家をブロックしていると述べました。これはMSDNによってバックアップされています-それは完全には出てこないのですが、リーダーライターロックの回避について言及しているだけです。つまり、私が望む動作はSQLServerに実装されていません。