3

次のSQLステートメントは、mssqlserver2000サーバーでデッドロックを生成することがあります

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は、削除と選択で呼び出されているため、ブロッキングのルートであると思われますが、動作を再現できません。

4

5 に答える 5

1

データベースでいくつかのトレース フラグを有効にして、デッドロック チェーンを説明するログを出力する必要があります。

トレース フラグ 1204、1205、および 1206 を使用して SQL サーバーを起動してみてください。次に、デッドロック チェーンを投稿します。

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)
于 2009-02-11T10:24:05.213 に答える
1

クエリを次のように変更してみてください。

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の代わりにselect *を使用して、削除する前にこれらのクエリをテストできます。

于 2009-02-11T10:42:00.117 に答える
0

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
)
于 2009-02-10T19:56:40.027 に答える