存在しない場合はselect上のsqlサーバーローロックを挿入トランザクションを挿入します

StackOverflow https://stackoverflow.com/questions/4339320

質問

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は持っていません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top