Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データベースの作成 » トランザクションと独立性レベルの使用 » トランザクションのブロックとデッドロック » トランザクションのブロック

 

デッドロック

トランザクションのブロックによって、「デッドロック」が起こる可能性があります。デッドロックとは、トランザクションのまとまりで、そのどれもが処理を進行できない状態をいいます。

デッドロックの理由

デッドロックが発生する理由は次の 2 つです。

  • 環状ブロックの競合   トランザクション A がトランザクション B にブロックされ、トランザクション B がトランザクション A にブロックされている状態。この状態から脱け出すには、どちらかのトランザクションをキャンセルします。同様の状況は 3 つ以上のトランザクションが環状にブロックされた場合にも発生します。

  • アクティブなデータベース・スレッドがすべてブロックされている   トランザクションがブロックされても、データベース・スレッドは放棄されたわけではありません。サーバが 3 つのスレッドで設定されていて、トランザクション A、B、C が現在要求を実行していないトランザクション D にブロックされると、これ以上使えるスレッドがなくなるためデッドロックとなります。

トランザクションのデッドロックを排除するには、SQL Anywhere はデッドロックに関わっている接続を選択し、その接続でアクティブなトランザクションの変更をロールバックして、エラーを返します。SQL Anywhere は内部のヒューリスティックを使用してロールバックする接続を選択し、blocking_timeout によって決められた残りのブロックの待機時間が最も短い接続を優先します。すべての接続が永久に待機するように設定されている場合は、サーバによってデッドロックが検出された接続を、犠牲にする接続として選択します。

スレッドのデッドロックを排除するには、SQL Anywhere はブロックしている最後の接続を選択し、その接続でアクティブなトランザクションの変更をロールバックして、エラーを返します。

サーバが使用するデータベース・スレッドの数は、個々のデータベースの設定によって異なります。

データベース・スレッド数の設定の詳細については、スレッド動作の制御を参照してください。


ブロックされているユーザの判別
Sybase Central からデッドロックの表示