【发布时间】:2018-04-20 12:32:25
【问题描述】:
我们有一个 SP,它在插入行之后执行。它会更新事务中的多个表,但在某些情况下,当插入几行并同时执行 SP 时 - 它会陷入死锁。我们尝试对其进行优化,并降低了以死锁结束的机会 - 但无法避免。
现在我们尝试了另一种方式(这个 SP 在事务中运行):
DECLARE @padLock INT
BEGIN TRY
EXEC @padLock = sp_getapplock @Resource='mytable_modify', @LockMode='Exclusive', @LockOwner='Transaction';
IF @padLock < 0
THROW 99888, 'Lock named [mytable_modify] cannot be acquired.', 1
...
do some stuff which might cause deadlock
...
EXEC sp_releaseapplock @Resource = 'mytable_modify', @LockOwner='Transaction';
END TRY
BEGIN CATCH
SELECT
@strErrMsg = ERROR_MESSAGE() +
'Line:' + CONVERT(varchar(5), ERROR_LINE()),
@intErrSeverity = ERROR_SEVERITY(),
@intErrState = ERROR_STATE();
if @padLock >= 0
EXEC sp_releaseapplock @Resource = 'mytable_modify', @LockOwner='Transaction';
RAISERROR(@strErrMsg, -- Message text.
@intErrSeverity, -- Severity.
@intErrState -- State
);
END CATCH;
这是一种好的做法,还是我们仍然有麻烦?
【问题讨论】:
标签: sql sql-server-2012 locking deadlock