我正在尋找適當的方法,以防止鎖死的問題被多個進程試圖更新表相同的記錄造成的。我已經能夠通過首先選擇記錄WITH (UPDLOCK)
然後進行更新來防止死鎖。但是,我不確定這是否會一直工作,或者當其他進程插入新記錄或更新此表中的其他記錄時,它會導致其他阻塞問題。SQL服務器死鎖問題
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
死鎖通常涉及至少2個資源(表)。你有錯誤消息/場景? – davmos 2013-05-09 17:31:36
你爲什麼選擇進入交易?爲什麼你不在交易之外? – 2013-05-09 17:38:09
您還可以使用(updlock)添加更新命令 – Jimbo 2013-05-09 17:38:22