0

他のセッションがこれらのレコードを処理しないようにするために、テーブルからいくつかのレコードを選択し、これらのレコードの主キーを一時テーブルに格納し、レコードに排他ロックを適用する必要がある状況があります。私はヒントをロックしてこれを達成します:

begin tran
insert into #temp
select pk from myTable with(xlock)
inner join otherTables, etc
(Do something with records in #temp, after which they won't be candidates for selection any more)
commit

問題は、必要以上に多くのレコードがロックされていることです。実際に一時テーブルに挿入されたレコードのみをロックしたいと思います。最初は、(ロック ヒントを使用するのではなく) レコードが使用中であることを示すフラグをテーブルに設定していましたが、状況によって 1 つ以上のレコードが処理されない場合、データベースが無効な状態のままになるため、これには問題がありました。

4

1 に答える 1

0

おそらく、別の分離レベルを設定し、rowlock テーブル ヒントを使用することが、あなたが探しているものでしょうか?

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

WITH (ROWLOCK)

それとも、XLOCK と ROWLOCK を組み合わせればうまくいくのでしょうか?

ドキュメントには次のように記載されています。

XLOCK

トランザクションが完了するまで、排他ロックを取得して保持することを指定します。ROWLOCK、PAGLOCK、または TABLOCK で指定された場合、排他ロックは適切な粒度レベルに適用されます。

私はこれを自分で試したことはありません。

于 2013-01-08T12:29:03.430 に答える