日本語

エラー: ORA-00060: deadlock detected while waiting for resource

エラー メッセージ

複数のセッションがデータベース オブジェクトに対してリソースを取得しようとしたときに、2 番目のセッションがそのリソースを現在保持していて、1 番目のセッションによって保持されているリソースも取得しようとした場合に、Oracle のデッドロックが発生します。

デッドロックを解消するために、Oracle は 1 つのセッションが保持しているリソースを解放し、エラーを返して、他のセッションが処理を進めることができるようにします。 その際に、原因となっているセッションに関するトレース ファイルが、user_dump_dest 初期化パラメーターの値に基づいてディレクトリ内に作成されます。

バージョン対応ジオデータベースの圧縮中に、圧縮コマンドで Oracle のエラー「ORA-00060: deadlock detected while waiting for resource」が発生する可能性があります。

原因

圧縮中にこの Oracle のエラーが発生した場合、発生しているデッドロックは、通常のタイプのデッドロックではありません。その場合、2 つのセッションが、同じ行オブジェクトに対する更新または削除のリクエストを競合/ブロックしていますが、セグメントのブロック ヘッダー内の ITL スロットのブロックが発生しています。

この問題の詳細な説明については、Oracle Metalink ドキュメント 62354.1「TX Transaction locks - Example wait scenarios」のセクション「Waits due to Insufficient 'ITL' slots in a Block」を確認してください。

発生しているブロック状態は、state_lineages テーブルに関するもの、または 2 つのインデックス (lineages_pk または lineage__id_idx2) のうちの 1 つに関するもののいずれかである可能性があります。

通常このエラーは、多数のユーザーがバージョン対応ジオデータベースを同時に編集しているときに圧縮が実行された場合にのみ現れます。

解決策または対処法

このデッドロック エラーを解決するには、SDE ユーザーが state_lineage テーブルのインデックスまたは state_lineage テーブルを再作成し、オブジェクト ブロックのヘッダー内の初期トランザクション スロット数の値を増やす必要があります。

デフォルトでは、ArcGIS は、バージョニングで使用されるすべてのテーブルおよびインデックスを作成するときに、initrans の値を 4 に設定します。 initrans の値は、dbtune.sde ファイル内のキーワード DATA_DICTIONARY で制御されますが、インスタンスが最初に作成されるときにのみ参照されます。

インデックスの initrans の値を増やすには、SDE ユーザーがインデックスを再構築して、新しい値を指定します。

コード:
SQL> ALTER INDEX lineages_pk REBUILD INITRANS 8;

インデックスが変更されます。

SQL> ALTER INDEX lineages_id_idx2 REBUILD INITRANS 8;

インデックスが変更されます。


state_lineages テーブルのサイズを増やす場合は、テーブルを変更します。

コード:
SQL> ALTER TABLE state_lineages INITRANS 8;

テーブルが変更されます。


テーブルの場合、この変更が既存のデータ ブロックに適用されず、テーブルが拡大して新しいブロックが追加されたときにのみ適用されるという制限があります。 デッドロックがテーブルで発生し、テーブルを変更しても問題が解決されない場合は、テーブル自体をエクスポートし、削除して再作成する必要があります。 より大きい initrans の値を設定し、各行を新しいテーブルにインポートする必要もあります。

8 以上の initrans の値で十分ですが、多数の編集者が同時に存在する大規模な組織の場合、8 の値では不十分かもしれません。 Oracle DBA は、インスタンスを監視し、ITL スロットを待機するブロック状態の頻度を検索します。 ブロック状態が通常の待機イベントである場合は、この値をさらに増やす必要があります。 ブロック状態の監視方法の手順については、Oracle のドキュメントをご参照ください。

    関連情報