sql >> データベース >  >> RDS >> Sqlserver

ストアド プロシージャはテーブル/行をロックしますか?

    競合状態になる可能性があります。

    1 つのステートメントで実行できます:

    • UPDATE で割り当てることができます
    • ロック ヒントにより、別のプロセスがスキップできるようになります この行
    • OUTPUT 句は呼び出し元にデータを返します

    これを試してください... (編集:ホールドロックが削除されました)

    Update TOP (1) ServerLoginUsers WITH (ROWLOCK, READPAST)
    OUTPUT INSERTED.*
    SET
       AssignedTo = @User, AssignedToDate = getdate(), SourcePool = @UserPool
    WHERE
       AssignedTo is null and [TsServer] = @Server   -- not needed -> and UserName = @ServerUser
      

    そうでない場合は、別の選択が必要になる場合があります

    Update TOP (1) ServerLoginUsers WITH (ROWLOCK, READPAST)
    SET
        -- yes, assign in an update
       @ServerUser = UserName,
       -- write
       AssignedTo = @User, AssignedToDate = getdate(), SourcePool = @UserPool
    OUTPUT INSERTED.*
    WHERE
       AssignedTo is null and [TsServer] = @Server   -- not needed -> and UserName = @ServerUser
    
    SELECT ...
      

    詳細については、こちらを参照してください:SQL Server プロセス キューの競合状態




    1. SQL Serverエラー110:INSERTステートメントには、VALUES句で指定された値よりも少ない列があります。

    2. SQL Server:テーブルの最大行数

    3. ある範囲の日付の間の日付の取得

    4. テーブルのランクを更新しています