ORA-02049: Timeout: distributed transaction waiting for lock
Oracle의미
분산 트랜잭션이 원격 데이터베이스의 락을 기다리는 동안 DISTRIBUTED_LOCK_TIMEOUT을 초과했다. 트랜잭션이 타임아웃되었다.
원인
database link를 통해 실행되는 트랜잭션이 원격 측의 잠긴 행을 기다림. 원격 세션의 긴 트랜잭션, 네트워크 지연, 또는 양쪽에서 보유한 충돌 락.
해결 방법
원격 데이터베이스에서 블로킹 락과 세션을 찾아 해결한다(v$lock, v$session). 분산 트랜잭션은 짧게 유지하고 필요한 락은 가능한 한 늦게 획득한다. 필요하면 워크로드에 맞게 DISTRIBUTED_LOCK_TIMEOUT을 늘린다(SPFILE, 재시작 필요). in-doubt 분산 트랜잭션은 DBA_2PC_PENDING 뷰를 확인하고 필요하면 수동으로 해결한다.
같은 데이터베이스의 다른 항목
- ORA-28000The account is locked
- ORA-01578Oracle data block corrupted (file #, block #)
- ORA-01722Invalid number
- enq: TX - row lock contention대기: 다른 트랜잭션이 보유한 행 수준 락에 세션이 블로킹됨
- log file sync대기: 커밋 시 LGWR이 redo를 디스크에 플러시하기를 세션이 기다림
- db file sequential read대기: 단일 블록 물리 읽기, 보통 인덱스 또는 테이블 조회
- db file scattered read대기: 다중 블록 물리 읽기, 보통 full table scan 또는 index fast full scan