我在桌子上遇到很多死锁。 它是SQL Server 2005
获得错误的sp执行以下操作
Delete From
EmployeeAccrualAdj
Where
EmployeeID = @iEmployeeID and
SchemeCode = @sSchemeCode and
AdjTypeCode = @sAdjTypeCode and
EffectiveDate >= @dtDateFrom
我正在尝试解决数据库在删除时是否正在执行行,页或表锁定?
另外,我正在考虑将sp重写为
declare @ToDelete table (id int IDENTITY(1,1),
AccrualAdjID int NOT NULL)
insert into @ToDelete
SELECT
AccrualAdjID
FROM
EmployeeAccrualAdj
Where
EmployeeID = @iEmployeeID and
SchemeCode = @sSchemeCode and
AdjTypeCode = @sAdjTypeCode and
EffectiveDate >= @dtDateFrom
DECLARE @iCount int, @iMax int
SELECT
@iCount = 1, @iMax = MAX(id)
FROM
@ToDelete
declare @iAccrualAdjID int
WHILE @iCount <= @iMax
BEGIN
select @iAccrualAdjID = AccrualAdjID FROM @ToDelete WHERE id = @iCount
DELETE FROM EmployeeAccrualAdj
WHERE @iAccrualAdjID = AccrualAdjID
SET @iCOunt = @iCount + 1
END
有效地循环遍历要删除的行并一次删除一行。
我认为如果有行锁定,这将没有任何区别,但是如果有页面或表锁定的话 你们都觉得怎么样?
答案 0 :(得分:1)
答案取决于lock escalation rules。如果你有很多行,你想知道的基于光标的方法会非常慢。我会在DELETE
操作期间查看其他查询是否正在访问该表,并查看是否可以通过抢先锁定获取在删除期间阻止它们。
This article举例说明如何使用UPDLOCK
锁定提示预先获取所需的锁定。