Тупик при удалении-выборе - PullRequest
3 голосов
/ 10 февраля 2009

Следующий оператор SQL иногда генерирует взаимоблокировки на моем сервере mssqlserver 2000

delete from tb_intervaloServico 
where idFeriado in (
    select ints.idIntervalo 
    from tb_periodicidadeServico ps, tb_intervaloServico ints 
    where ints.idPeriodicidadeServico=ps.idPeriodicidadeServico
    and idservicoContrato='7f20b4af-9076-48f9-a861-8b78273eadc3'
    and fromFixa=0)

По какой-то причине удаление получает статус блокировки и не завершается (?) Единственный другой процесс, который я нахожу заблокированным этим, - это план обслуживания, который запускается в выходные дни для воссоздания индексов, поэтому Идея, что может быть причиной проблемы.

Это блокировки, генерируемые удалением ...

Object                  Lock Type Mode Status Owner
tb_intervaloServico     TAB       IX   GRANT  Xact
tb_periodicidadeServico TAB       IS   GRANT  Xact

У кого-нибудь есть указания, как добраться до корня проблемы? У меня есть подозрение, что таблица tb_intervaloServico является корнем блокировки, потому что она вызывается при удалении и выборе, но я не могу воспроизвести поведение.

Ответы [ 5 ]

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

попробуйте изменить ваш запрос на:

delete tis
from 
    tb_intervaloServico tis
where tis.idFeriado in (
    select ints.idIntervalo 
    from tb_periodicidadeServico ps, tb_intervaloServico ints 
    where ints.idPeriodicidadeServico=ps.idPeriodicidadeServico
    and idservicoContrato='7f20b4af-9076-48f9-a861-8b78273eadc3'
    and fromFixa=0)

или, может быть:

delete tis
from 
    tb_intervaloServico tis
    inner join tb_intervaloServico ints
        on tis.idFeriado = ints.idIntervalo
    inner join tb_periodicidadeServico ps
        on ints.idPeriodicidadeServico = ps.idPeriodicidadeServico
        and idservicoContrato='7f20b4af-9076-48f9-a861-8b78273eadc3' -- add the correct table prefix for idservicoContrato
        and fromFixa = 0 -- add the correct table prefix for fromFixa

Вы можете проверить эти запросы перед удалением, используя выберите * вместо delete

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

Вам нужно включить некоторые флаги трассировки в вашей базе данных, чтобы вы получили распечатку в своем журнале, которая объясняет цепочку тупиков.

Попробуйте запустить SQL-сервер с флагами трассировки 1204, 1205 и 1206. Затем опубликуйте цепочку взаимоблокировок.

Вы можете попытаться увеличить блокировки в вашем sql, возможно, это исправит это, но без распечатки цепочки невозможно сказать

Так что, возможно, это поможет:

delete from tb_intervaloServico 
where idFeriado in (
    select ints.idIntervalo 
    from tb_periodicidadeServico ps, tb_intervaloServico ints 
    with (updlock,serializable)
    where ints.idPeriodicidadeServico=ps.idPeriodicidadeServico
    and idservicoContrato='7f20b4af-9076-48f9-a861-8b78273eadc3'
    and fromFixa=0)
1 голос
/ 10 февраля 2009

Похоже, ваш запрос самоблокирующийся. Возможно, вы захотите прочитать эту ветку новостной группы (особенно публикацию Santeri Voutilainen) об этой проблеме.

Вероятно, это проблема SP4. Вы можете попытаться уменьшить параллелизм запросов, сократив количество процессоров, используемых для выполнения запросов. Для этого вы можете использовать опцию подсказки запроса (MAXDOP n), где n - количество параллельных потоков. Установка n = 0 означает использование всех доступных процессоров.

В качестве альтернативы вы также можете установить глобальную опцию: в Enterprise Manager в разделе «Свойства - Процессор - Параллелизм» установите переключатель рядом с «Использовать» и выберите 1.

0 голосов
/ 10 февраля 2009

Ваше удаление из таблицы, к которой вы присоединились, tb_intervaloServico. Скопируйте ваш подзапрос во временную таблицу и используйте временную таблицу при удалении.

select ints.idIntervalo into #deleteMeId
from tb_periodicidadeServico ps, tb_intervaloServico ints 
where ints.idPeriodicidadeServico=ps.idPeriodicidadeServico
and idservicoContrato='7f20b4af-9076-48f9-a861-8b78273eadc3'
and fromFixa=0)

delete from tb_intervaloServico 
where idFeriado in (
select * from #deleteMeId
)
0 голосов
/ 10 февраля 2009

В следующей статье вы узнаете, как устранять тупики в SQL Server 2000.

http://msdn.microsoft.com/en-us/library/aa937573(SQL.80).aspx

Дайте мне знать, если вам нужна конкретная помощь.

Ура, Джон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...