none
デッドロックのエラーメッセージに関して RRS feed

  • 質問

  • お世話になっております。

    お世話になっております。

    現在稼働中のシステムでデッドロックが発生していることが確認できました。

    まずは「DBCC TRACEON (1204,1222,-1)」を実施して情報採取をしていく方針ですがアプリ側のログメッセージが二種類あり、これの意味合いが分かりません。

    a.トランザクション (プロセス ID 98) が、ロック | 通信バッファー 個のリソースで他のプロセスとデッドロックして、このトランザクションがそのデッドロックの対象となりました。トランザクションを再実行してください。

    b.トランザクション (プロセス ID 106) が、ロック 個のリソースで他のプロセスとデッドロックして、このトランザクションがそのデッドロックの対象となりました。トランザクションを再実行してください。

    bは一般的に言われる「処理順違いによる競合」と理解しておりますが、aの通信バッファとは何を示しているのでしょうか?
    例えばネットワーク負荷によるもの、など。

    また、これまでデッドロックとは「処理順違いによる競合」が原因と認識していましたが、サイトを巡り情報収集していると、回避策として「インデックスなどが適切に設定されているかチェックする」との記述がみられます。たとえばクエリの遅延やブロッキングが積み重なってデッドロックとなる、などの原因も考えられるのでしょうか?

    利用状況モニタなどを見ると「コストが高いクエリ」が列挙されており、実行計画では追加インデックスが推奨される状態なのですが、これをそのまま実行していくと今度はインデックスのデッドロックの懸念もありどのように判断に迷っているところです。

    宜しくお願い致します。
    2017年5月11日 1:12

回答

すべての返信

  • あまり詳しくないので検索してみただけですが、通信バッファのデッドロックは並列クエリに関係していそうですね。

    SQLserverのデッドロック
    https://qa.atmarkit.co.jp/q/249

    Deadlock on Communication Buffe
    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/9154f1cf-fd0b-4980-aefe-521bafccd0df/deadlock-on-communication-buffer?forum=sqldatabaseengine

    また、インデックスのデッドロックに関しては以下を参照されたのでしょうか?

    SQL SERVERにおけるデッドロック(内部仕様)~クラスタ化インデックスと非クラスタ化インデックス間のデッドロック~
    http://bxdxmx.hatenablog.com/entry/20090820/1250746566

    SQL Serverもバージョンが上がっていますので、バージョンによっては改善されているかもしれませんね。
    上記は何かの参考になるかもしれませんが、あまり回答になっていなくてごめんなさい。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク tele1974 2017年5月11日 7:19
    2017年5月11日 5:46
  • trapemiya様

    ありがとうございます。

    頂いたURL含め他にも並列クエリ利用時に同じ状況が発生するとの記事がありました。
    並列はクエリ発行時に意識しているものではないのでそこまで考えが及びませんでした。

    現在利用しているのはSQLServer2008R2Sp1なのですが、Sp2で本件の修正プログラムが出ているようです。
    が、既に稼働しているシステムにSPを適用する判断は容易ではないです。

    並列を禁止するようSQLServerの設定を実施するというのも手ですが、パフォーマンスの懸念も
    あるので、これも簡単には判断できず、という状況の場合発生個所が見えているのであれば
    PG側でリトライを組み込んだほうが良いのかもしれません。

    トレースフラグの結果とともに再検討致します。

    ありがとうございました。


    2017年5月11日 7:19