none
デッドロックの排除について RRS feed

  • 質問

  •  

    現在、パフォーマンス試験でデッドロックが多発しております。

    その対応検討の中で議論になったのですが、デッドロックの発生をゼロにすることが出来るのでしょうか?

     

    SQL Serverのブックスオンラインを見ると、「最小限に抑える必要がある」という記述があります。

    あえて「最小限」と書いてあるので、防げないデッドロックもあるのかと思いました。

    では、この防げないデッドロックとは何かについて、皆様にお聞きしたいと思い投稿しました。

    どう実装しても防げないデッドロックってあるのでしょうか?

    ご教授頂けますでしょうか?

     

     

    2007年9月7日 16:14

回答

  • SQL Server 2005 Books Online デッドロックの最小化

    http://msdn2.microsoft.com/ja-jp/library/ms191242.aspx

    こちらに、「デッドロックを完全に回避することはできませんが、コーディング上の一定の規則に従うことにより、デッドロックが発生する可能性を最小限に抑えることができます。」と書かれています。つまり、デッドロックとは二人以上のユーザーが同時実行するときに起こりうるものだということです。

    デッドロックに種類があるわけではなくて、デッドロックは、「ロックしたお互いが待ち合ってしまう」という普遍的な事柄そのものです。上に記したURLには、その回避方法もいくつか述べられていますが、どれも重要な要素です。

     

    わかりやすい連載があるので、URLを掲載します。

    @IT 連載:SQL実践講座

    http://www.atmarkit.co.jp/fnetwork/rensai/sql27/sql1.html

    http://www.atmarkit.co.jp/fnetwork/rensai/sql28/sql1.html

     

    この連載は、SQL Server 2000ですが、SQL Server 2005以降では、スナップショット分離レベルが追加されています。これは、ロックしてあるものは、ロック以前の状態を読み取ることができる優れものです。

    ただ、状況によって、ロックの種類や分離レベルを使い分ける必要があります。

    2007年9月7日 17:54
  • デットロックには以下のような複数の種類がございます。

     

    1. ロックリソース上のデッドロック (サイクルデッドロック、変換デッドロック)

    2. 並列クエリにおける並列クエリリリース間でのデッドロック

    3. スレッドリソースとロックリソースにまたがるデッドロック

     

    確かに、実装次第でデッドロックの発生頻度を軽減させることは可能ですが、例えば

    並列プランを実行する場合、SQL Server は、スレッド間のデッドロックを検出し可能な限り内部的に解決を行うように処理を

    実施いたしますが、データの配置状況、Indexの断片化状況 などの要因により、内部的なデッドロックを回避することが出来ない

    場合がございます。

    よって、ロックという排他メカニズムを用いている以上、様々な対処によりデッドロックを減らすことは可能ですが、

    上記に記載 (あくまで一例ですが) したような要因により、 デッドロックは発生しうるため、完全には回避が出来ない

    ということになります。

     

    尚、上記のことは、ロックという排他メカニズムを使用しているデータベース全般に言えることとなっております。

    2007年9月13日 12:21

すべての返信

  • SQL Server 2005 Books Online デッドロックの最小化

    http://msdn2.microsoft.com/ja-jp/library/ms191242.aspx

    こちらに、「デッドロックを完全に回避することはできませんが、コーディング上の一定の規則に従うことにより、デッドロックが発生する可能性を最小限に抑えることができます。」と書かれています。つまり、デッドロックとは二人以上のユーザーが同時実行するときに起こりうるものだということです。

    デッドロックに種類があるわけではなくて、デッドロックは、「ロックしたお互いが待ち合ってしまう」という普遍的な事柄そのものです。上に記したURLには、その回避方法もいくつか述べられていますが、どれも重要な要素です。

     

    わかりやすい連載があるので、URLを掲載します。

    @IT 連載:SQL実践講座

    http://www.atmarkit.co.jp/fnetwork/rensai/sql27/sql1.html

    http://www.atmarkit.co.jp/fnetwork/rensai/sql28/sql1.html

     

    この連載は、SQL Server 2000ですが、SQL Server 2005以降では、スナップショット分離レベルが追加されています。これは、ロックしてあるものは、ロック以前の状態を読み取ることができる優れものです。

    ただ、状況によって、ロックの種類や分離レベルを使い分ける必要があります。

    2007年9月7日 17:54
  •  

    ご回答ありがとうございます。

    私もご指摘頂いたブックスオンラインは読みました。

     

    「デッドロックを完全に回避することはできません」と書かれている部分の具体例が知りたいのです。

    どういった場合には回避できないのか?それが知りたいのです。

     

    どうぞ、宜しくお願い致します。

     

    #個人的にはデッドロックは、ロック待ち状態に実装次第で修正できると思ってます。

     

     

     

    2007年9月8日 5:22
  • デットロックには以下のような複数の種類がございます。

     

    1. ロックリソース上のデッドロック (サイクルデッドロック、変換デッドロック)

    2. 並列クエリにおける並列クエリリリース間でのデッドロック

    3. スレッドリソースとロックリソースにまたがるデッドロック

     

    確かに、実装次第でデッドロックの発生頻度を軽減させることは可能ですが、例えば

    並列プランを実行する場合、SQL Server は、スレッド間のデッドロックを検出し可能な限り内部的に解決を行うように処理を

    実施いたしますが、データの配置状況、Indexの断片化状況 などの要因により、内部的なデッドロックを回避することが出来ない

    場合がございます。

    よって、ロックという排他メカニズムを用いている以上、様々な対処によりデッドロックを減らすことは可能ですが、

    上記に記載 (あくまで一例ですが) したような要因により、 デッドロックは発生しうるため、完全には回避が出来ない

    ということになります。

     

    尚、上記のことは、ロックという排他メカニズムを使用しているデータベース全般に言えることとなっております。

    2007年9月13日 12:21
  • ユクヒロ さん、こんにちは。

    フォーラムオペレーターの鈴木裕子です

     

    投稿からかなり時間が経っておりますが、大変有用な情報だと思いましたので、

    こちらを多くの方にも活用いただけるように、

    勝手ながら私の方で回答チェックを付けさせていただきました。

    もし不適切でしたらご修正いただければと思います。

     

    これからもForumをご活用くださいね!

    それでは。

    2008年10月30日 5:43
    モデレータ