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