7

Oracleがデッドロックを検出すると、次のようなトレースファイルが書き込まれます。

*** SESSION ID:(56.27081) 2012-05-14 08:16:28.013
DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock: Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-0010002c-002719b5       146      56     X            164      44           X
TX-000f002a-002edd1e       164      44     X            146      56           X
session 56: DID 0001-0092-00050D0D       session 44: DID 0001-00A4-0002E3C2
session 44: DID 0001-00A4-0002E3C2       session 56: DID 0001-0092-00050D0D
Rows waited on:
Session 44: obj - rowid = 00035157 - AAA1FXAAxAAASfLAAn
  (dictionary objn - 217431, file - 49, block - 75723, slot - 39)
Session 56: obj - rowid = 00035157 - AAA1FXAAsAACjuiAAP
  (dictionary objn - 217431, file - 44, block - 670626, slot - 15)

アプリケーションのデバッグを支援するために、上記の情報に基づいて関連する行を特定するにはどうすればよいですか?

4

1 に答える 1

12

私は答えを見つけました:

  1. 後の数字dictionary objnは、DBA_objectsから選択するために使用できます。

    SELECT owner, object_name, object_type 
    FROM dba_objects 
    WHERE object_id = 217431;
    
  2. テーブルが識別されると、rowidを使用して行を見つけることができます。

    SELECT * 
    FROM table_found_above 
    WHERE rowid = 'AAA1FXAAxAAASfLAAn';
    

トレースファイルに「待機中の行」がないと記載されている場合、この手法は機能しません。問題は、インデックス付けされていない外部キーが原因である可能性があります。

于 2012-05-14T03:44:10.553 に答える