6

SQL Server 2005 から 2008 にアップグレードしました。2005 年には ROWLOCK がまったく機能せず、実際のロックを行うには PAGELOCK または XLOCK を使用する必要があったことを覚えています。これを読んだ人は「何を間違えたの?」と尋ねるでしょう。何もない。「ROWLOCKED」行を編集できることを最終的に証明しましたが、ロック レベルをエスカレートすると編集できませんでした。これが SQL 2008 で機能するかどうかを確認する機会はありませんでした。最初の質問は、2008 年にこの問題に遭遇した人はいますか?

私の2番目の質問は次のとおりです。値が存在するかどうかをテストし、存在する場合は、行全体を挿入するのではなく、関連する列に対して更新を実行したいと考えています。これは、行が見つかった場合、メンテナンス手順によってプロセスの途中でこの行が削除され、エラーが発生する可能性があるため、ロックする必要があることを意味します。

原理を説明するために、次のコードは機能しますか?

BEGIN TRAN

SELECT      ProfileID
FROM        dbo.UseSessions
WITH        (ROWLOCK)
WHERE       (ProfileID = @ProfileID)
OPTION      (OPTIMIZE FOR (@ProfileID UNKNOWN))

if @@ROWCOUNT = 0 begin
    INSERT INTO dbo.UserSessions (ProfileID, SessionID)
    VALUES      (@ProfileID, @SessionID)
end else begin
    UPDATE      dbo.UserSessions
    SET         SessionID = @SessionID, Created = GETDATE()
    WHERE       (ProfileID = @ProfileID)
end

COMMIT TRAN
4

1 に答える 1

13

説明...

  • ROWLOCK/PAGELOCK は粒度です
  • XLOCKはモードです

粒度と分離レベルとモードは直交しています。

  • 粒度 = ロックされるもの = 行、ページ、テーブル ( PAGLOCK, ROWLOCK, TABLOCK)

  • 分離レベル = ロック期間、同時実行性 ( HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE)

  • モード = 共有/排他性 ( UPDLOCK, XLOCK)

  • 「組み合わせた」例NOLOCK, TABLOCKX

XLOCK は、必要に応じて行を排他的にロックします。ROWLOCK/PAGELOCK にはありません。

于 2010-12-02T21:42:35.743 に答える