🧩 ORA-02049とは
ORA-02049: timeout: distributed transaction waiting for lock は、Oracleデータベースの分散トランザクション(Distributed Transaction)で、ロック待ち状態が一定時間続いた結果、タイムアウトが発生したことを示すエラーです。
通常のローカルトランザクションではなく、DBリンクを跨いだ処理を行っている際に発生する点が特徴です。
🔍 主な発生原因
このエラーの原因は大きく分けて以下の3つです。
① 他セッションがロックを保持している
別のトランザクションがまだコミットまたはロールバックされておらず、対象の行・表をロック中。
そのため、他ノードや他セッションからの更新がブロックされ、一定時間後にタイムアウトします。
② 分散トランザクション中のロック競合
UPDATE table@remote_db ... のように DBリンクを通じてリモートDBを更新 している場合、リモート側でロックが競合すると、ローカル側から見ると「ロック待ち」となり、このエラーが発生します。
③ タイムアウト値が短すぎる
システムパラメータ DISTRIBUTED_LOCK_TIMEOUT の値が短く設定されていると、ロック解放前にタイムアウトしてしまうことがあります。
デフォルトは 60秒 です。
⚙️ ロック状況の確認方法
発生原因を特定するには、まずどのセッションがロックを保持しているかを確認します。
ロックを保持しているセッションが特定できたら、以下のように解放することも可能です。
※運用環境では慎重に実施してください。未コミットデータが失われる可能性があります。
⏱️ タイムアウト設定の調整
ロックが頻繁に発生する分散環境では、待機時間を長めに設定することで回避できる場合があります。
この例では、待機時間を 300秒(5分) に延長しています。
💡 類似エラーとの違い
| エラーコード | 内容 | 特徴 |
|---|---|---|
| ORA-00060 | デッドロックが検出された | 両者が互いに待機し合う状態 |
| ORA-02049 | 分散トランザクションのロック待ちタイムアウト | リモートDBを跨ぐ処理で発生 |
ORA-02049 は デッドロックではなく、単純なロック待ちタイムアウト である点に注意してください。
✅ まとめ
| 項目 | 内容 |
|---|---|
| エラー番号 | ORA-02049 |
| メッセージ | timeout: distributed transaction waiting for lock |
| 主な原因 | 分散トランザクション中のロック待ち |
| 対応策 | ロック保持セッションの確認・解放、タイムアウト値調整 |
| 推奨設定 | DISTRIBUTED_LOCK_TIMEOUT = 300(状況に応じて) |
