Я ищу подходящий способ предотвращения возникновения проблем с блокировкой, вызванных несколькими процессами, пытающимися обновить одну и ту же запись в таблице. Я смог предотвратить блокировки, сначала выбрав запись WITH (UPDLOCK)
, затем выполнив обновление. Однако я не уверен, что это будет работать все время или если это вызовет другие проблемы с блокировкой, когда другие процессы вставляют новые записи или обновляют другие записи в этой таблице.Ошибка SQL Server Deadlocking
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
Почему у вас есть выбор в транзакции? почему у вас нет его за пределами транзакции? –
вы также можете добавить с помощью (updlock) команду update – Jimbo