関数を単一のUPDATE
ステートメントとして定式化できる場合、明示的なロックは必要ありません。UPDATE
ステートメントには更新ロック ( U
) が必要であり、これは排他的です。たとえば、2 つのリーダーが同じ行で同時に更新ロックを取得することはできません。
UPDATE dbo.TableA
SET ManualID = CAST(CAST(ManualID AS INT) + 1 AS VARCHAR(20))
OUTPUT Inserted.ManualID -- return the newly inserted manual ID for your use
WHERE ..........
2 段階のプロセスが必要な場合は (SELECT
前に)、次のヒントをUPDATE
使用します。WITH (UPDLOCK)
SELECT
DECLARE @OldManualID VARCHAR(20)
BEGIN TRANSACTION
SELECT @OldManualID = ManualID
FROM dbo.TableA WITH (UPDLOCK)
WHERE........
-- do something with that manual ID
UPDATE dbo.TableA
SET ManualID = (new value of ManualID)
WHERE ..........
COMMIT TRANSACTION
どちらの場合も、単一の UPDATE または SELECT/UDPATE が更新ロックの下で実行されるため、2 つのプロセスがこれを同時に実行することはできません。それ以上のロックはまったく必要ないと思います-絶対に完全なテーブルロックではありません....