如何找出表格的锁定类型?

时间:2010-02-10 23:03:18

标签: sql-server-2005 deadlock

我在桌子上遇到很多死锁。 它是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

有效地循环遍历要删除的行并一次删除一行。

我认为如果有行锁定,这将没有任何区别,但是如果有页面或表锁定的话 你们都觉得怎么样?

1 个答案:

答案 0 :(得分:1)

答案取决于lock escalation rules。如果你有很多行,你想知道的基于光标的方法会非常慢。我会在DELETE操作期间查看其他查询是否正在访问该表,并查看是否可以通过抢先锁定获取在删除期间阻止它们。

This article举例说明如何使用UPDLOCK锁定提示预先获取所需的锁定。