web-dev-qa-db-ja.com

`WITH(NOLOCK)`を使用してデッドロックを防ぐことはできますか?

私はInsertDeleteおよびSelectのみのテーブルを持っています(Updatesはありません)

挿入時、セッションロックが使用されることがあった(WITH (TABLOCKX)

単純な順次クエリを開くために、_RecordSet::Open_コマンドを使用して、テーブルからADO which Selectを使用するプログラムがあります。

お気に入り:

_Select * from t1 where id >= @from_id And >= @to_id`  
_

または:

_Select top(10) * from t1 where id >= @id Order by id 
_

Id列はIdentity列です。

クエリを開いているときに、デッドロックが発生することがあります。 (テーブルはInsertクエリによってロックされ、id列のインデックスはSelectによってロックされます)

デッドロックを防ごうとしています。

選択クエリを開く必要がありますかWITH(NOLOCK)?デッドロックを防ぐことができますか?

1
SHR

より良いアイデアは、スナップショット分離を有効にすることです: https://docs.Microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server

これにより、各トランザクションはデータの独自のスナップショットを取得でき、他のトランザクションをロックまたはブロックしません。

5
Blake