Как узнать, какой тип блокировки таблицы имеет? - PullRequest
0 голосов
/ 11 февраля 2010

Я получаю много тупиков на столе. Это 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 Ответ

1 голос
/ 11 февраля 2010

Ответ зависит от правил эскалации блокировки . Подход, основанный на курсоре, который вас интересует, будет удивительно медленным, если у вас очень много строк. Я бы посмотрел, какие другие запросы попадают в эту таблицу во время операции DELETE, и выясню, можно ли их заблокировать на время удаления с получением преимущественной блокировки.

В этой статье приведен пример получения необходимых блокировок с помощью UPDLOCK подсказки о блокировке.

...