TECHNOLOGY
Tips !(使用上のテクニック)
対象バージョン : Adaptive Server Anywhere 6.0、7.0
対象OS : Windows95/98/ME ,WindowsNT/2000
ST0110019
デッドロックについて
Tips !
デッドロックとは
あるトランザクションのまとまりで、そのどれもが処理を進行できない状態をいいます。
デッドロックの発生理由
デッドロックが発生する理由は次の 2 つです。
- 環状ブロックの競合トランザクション A がトランザクション B にブロックされ、トランザクション B がトランザクション A にブロックされている状態。この状態から脱け出すには、どちらかのトランザクションをキャンセルする必要があります。同様の状況は 3 つ以上のトランザクションが環状にブロックされた場合にも発生します。
- すべてのアクティブなデータベース・スレッドがブロックされているトランザクションがブロックされても、データベース・スレッドは放棄されたわけではありません。データベースが3 つのスレッドで設定されていて、トランザクション A、B、C が現在要求を実行していないトランザクション D にブロックされると、これ以上使えるスレッドがなくなるためデッドロックとなります。
Adaptive Server Anywhere は、最後にブロックされたトランザクションを自動的にキャンセルして、デッドロックを解放します。キャンセルされたトランザクションにはデッドロックの種類を示すエラー・メッセージを返します。
サーバが使用するデータベース・スレッドの数は、個々のデータベースの設定によって異なります。
<データベース・スレッド数の設定方法>
データベースを起動するコマンド(dbsrv7(6)/dbeng7(6))で-gnスイッチを使用し実行スレッド数を設定します
ネットワーク・データベース・サーバのデフォルトのスレッド数は 20 個、パーソナル・データベース・サーバは10 個です。各接続では、1 つの要求に対して 1 つのスレッドを使用するので、スレッドの数がサーバ接続の数より大きくなることはないため、パーソナル・データベース・サーバの最大スレッド数は10 になります。パーソナル・データベース・サーバの最大10個の接続しかできません。
ブロックされているユーザの判別
sa_conn_info システム・プロシージャを使用して、どの接続がどの接続でブロックされているかを判別できます。このプロシージャは、接続ごとに 1 つのローで構成される結果セットを返します。結果セットのカラムの 1 つには、接続がブロックされているかどうか、およびブロックされている場合は、どの接続でブロックされているかがリストされます。