6

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 
+5

「MERGE」(http://technet.microsoft.com/en-us/library/bb510625.aspx)を使用できない理由はありますか? –

+0

ありがとう@Ed。私はコマンドが存在することを知らなかった。それは質問に答えます。 – IamIC

+0

それは私の誤りでした。もちろん。 – IamIC

答えて

13

説明...

  • ROWLOCK/PAGELOCKはXLOCKモード

粒度と分離レベルとモードが直交してある粒状

  • あります。

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

    • 分離レベル=ロック継続時間、並行性(HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE

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

    • "combined"例えば、NOLOCK, TABLOCKX

    XLOCKは、あなたが望むように排他的に行をロックしていました。 ROWLOCK/PAGELOCKは持っていません。

  • +0

    ありがとう@gbn。だから "\t(XLOCK、ROWLOCK)で"トリックを行うだろう:) – IamIC

    +0

    奇妙なWITH(PAGELOCK)行をロックしました。あなたが言っていることから、なぜそれがあるのか​​分かりません。 – IamIC

    +0

    @IanCいいえ、それは確かにトリックをしないだろう - 上記の私の答えを読む:) –