テーブル内の同じレコードを更新しようとする複数のプロセスによって引き起こされるデッドロックの問題を防ぐ適切な方法を探しています。最初にレコードWITH (UPDLOCK)
を選択してから更新を行うことで、デッドロックを防ぐことができました。ただし、これが常に機能するかどうか、または他のプロセスが新しいレコードを挿入したり、このテーブルの他のレコードを更新したりするときに、他のブロックの問題が発生するかどうかはわかりません.
CREATE PROCEDURE usp_ReduceOrderAmount
@OrderId INT,
@ReductionAmount INT
AS
BEGIN
SET NOCOUNT ON
DECLARE @dDateTime AS DATETIME
SET @dDateTime = GETUTCDATE()
BEGIN TRANSACTION
--Quick Fix... Attempt to block other callers who are trying to update the same record.
SELECT * FROM ORDERS WITH (UPDLOCK) WHERE ORDER_ID = @OrderId
UPDATE dbo.ORDERS
SET QTY_OPEN = QTY_OPEN - @ReductionAmount,
UPDATED_WHEN = @dDateTime
WHERE ORDER_ID = @OrderId
COMMIT
END