存在しない場合はselect上のsqlサーバーローロックを挿入トランザクションを挿入します
-
30-09-2019 - |
質問
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
解決
説明...
- Rowlock/Pagelockは粒度です
- Xlockはモードです
粒度と分離レベルとモードは直交です。
granularity =ロックされているもの=行、ページ、テーブル(
PAGLOCK, ROWLOCK, TABLOCK
)分離レベル=ロック期間、並行性(
HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE
)モード=共有/排他性(
UPDLOCK, XLOCK
)「組み合わせ」例
NOLOCK, TABLOCKX
Xlockは、必要に応じて列のみをロックしていたでしょう。 Rowlock/Pagelockは持っていません。
所属していません StackOverflow