SQL Server 2005から2008にアップグレードしました。2005年にROWLOCKが機能しなくなり、PAGELOCKまたはXLOCKを使用して実際のロック。私はこれについての読者が "あなたは何を間違えたのですか?"何もない。私は結論として、「ROWLOCKED」行を編集できることを証明しましたが、ロックレベルを上げるとできませんでした。私はSQL 2008でこれが動作するかどうかを確認する機会はありませんでした。私の最初の質問は、誰も2008年にこの問題を遭遇しているということですか?SELECTを使用してSQL Server ROWLOCKが存在しない場合INSERTトランザクション
私の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
「MERGE」(http://technet.microsoft.com/en-us/library/bb510625.aspx)を使用できない理由はありますか? –
ありがとう@Ed。私はコマンドが存在することを知らなかった。それは質問に答えます。 – IamIC
それは私の誤りでした。もちろん。 – IamIC