「トランザクション」タグアーカイブ

Oracle「ORA-02049: timeout: distributed transaction waiting for lock」エラーの原因と解決策まとめ

🧩 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(状況に応じて)