質問

私は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 -まったく出てきてそうは言っていませんが、リーダー/ライターのロックを避けることに言及しているだけです。要するに、私が望む動作はSQL Serverに実装されていません。

役に立ちましたか?

解決

SNAPSHOT分離レベルは、すべての分離レベルと同様に、読み取りのみに影響します。書き込みは互いにブロックしています。表示されるブロックが読み取りブロックであると思われる場合は、さらに調査し、ブロックが発生するリソースタイプとリソース名を確認する必要があります( sys.dm_exec_requests )。

開発者が数分間デバッガーを見つめるシナリオをサポートするために、コードを変更することはお勧めしません。このシナリオが実稼働環境で繰り返される(つまり、クライアントがハングする)と思われる場合は、別の話になります。目的を達成するには、書き込みを最小化し、トランザクションの最後にすべての書き込みを、戻り前にコミットする単一の呼び出しで実行する必要があります。この方法では、クライアントはXロックを長時間保持できません(Xロックを保持している間はハングできません)。実際には、これを実行するのはかなり難しく、開発者がデータアクセスコードを記述する方法について多くの規律が必要です。

他のヒント

ある開発者がトランザクションを一時停止したときのロックを確認しましたか?また、スナップショット分離レベルをオンにしただけではあまり効果がありません。 ALLOW_SNAPSHOT_ISOLATIONをONに設定しましたか?

手順は次のとおりです。

ALTER DATABASE <databasename>
SET READ_COMMITTED_SNAPSHOT ON;
GO

ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO

データベースのスナップショット分離が有効になった後、開発者とユーザーはトランザクションをこのスナップショットモードで実行するように要求する必要があります。これは、ADO.NETトランザクションオブジェクトのクライアント側ディレクティブによって、または次のステートメントを使用してTransact-SQLクエリ内で、トランザクションを開始する前に行う必要があります。

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Raj

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top