2010-12-13 6 views
3

にロック:読み取り専用私はこれは私のシナリオでSQL Server 2008で何かWRTロックを欠けているように見えるSQL Serverの

  1. TRAN開始します。
  2. テーブルAから読み取り、特定の行が見つかるようにします。
  3. 読み取り中は、読み取り専用ロックを読み取ります。見つからない場合は、エラーをスローします。
  4. 表Aへの参照を含む表Bに挿入してください。
  5. tran(ロック解除)をコミットします。

さまざまな設計上の制約のため、この特定のインスタンスでは、これを管理するための関係を作成することはできません。だから私はコードでそれをする必要があります。

テーブルをXLOCKまたはUPDLOCKしたくないのですが、私が行っているトランザクションは読み込みのみであり、書き込みではありません。しかし、明らかに私は参照された行を更新/削除することを望んでいません。 だから私は外部の視点からの読み取り専用ロックが必要です

私は幻想読解を可能にしたくありません。私は明らかに異なる行のバージョンを可能にしたくありません。 (削除後)トリガがテーブルB

に参照をヌルになるので

TRANがコミットされたら、それはAを変更するテーブルの罰金だこれは私が持っているものです。

BEGIN TRAN 
-- test 
IF NOT EXISTS (
    SELECT 1 
    FROM Table1 
    WITH (HOLDLOCK, ROWLOCK) 
    WHERE (ID = @ID) 
) {throw} 

    {perform insert into Table2} 
COMMIT TRAN 

答えて

1

取引の間、取引分離レベルをREPEATABLE READに設定してください。私の意見では、コード実装の明確さが向上しているため、ロックヒントを使用することも好ましい方法です。

1行しか読んでいないので、セットへの範囲挿入について心配する必要はなく、REPEATABLE READの警告があります。

Professional SQL Server 2008 Internals and Troubleshootingの「ロックとラッチ」の章を読むことをお勧めします。これには、コード例を含め、SQL Serverで利用可能なさまざまな分離レベルの優れた説明と、ファントムなどの各データ異常シナリオのメカニズムの説明が含まれています。

免責事項:このタイトルのために給与計算をしていますが、私は2つのコピーを持っています。

+0

ありがとうジョン:) – IamIC

+0

お手伝いしてうれしいです! –

関連する問題