정상 운영중이던 시스템에서 잠깐동안 갑자기 쿼리(SELECT) 응답이 늦어졌었습니다. 그것도 특정 뷰랑 관련된 쿼리들에서만요.
위 발생 시점에 ASH를 통해 발생한 EVENT를 봤더니 enq : TX - Contention이 계속 발생했었습니다.
enq : TX - Contention에 대해 조사하던 중 Practical OWI 책에서 Waiting이 발생한 원인에 대해 설명을 조금 찾았습니다.
"분산 트랜잭션 환경에서 Prepared Transaction에 의애 lock이 획득된 row를 읽는 경우, transaction이 종료(rollback, commit, in-doubt) 될때까지 tx lock을 shared mode로 획득하기 위해 대기" 한다고 합니다.
다른 원인도 있을 수 있겠지만 마침 본 시스템에서도 응답이 늦어지기 바로 한 1~2분 전에 분산 트랜잭션(DML)이 실행되고 있습니다. 그 분산 트랜잭션에 관련된 테이블이 바로 위 뷰를 통해 조회되는 테이블 중 하나이기도 하구요.
그런데 제 생각에는 전체 분산 트랜잭션이 완전히 종료되기 전까지는 분산 트랜잭션으로 변경되기 이전 이미지가 조회되야할 것이고 그렇다면 shared mode로 lock을 획득하기 위해 대기할 필요가 없을 것 같은데요..,
제 생각은 이렇지만 어쨌든 뭔가 바로 shared mode로 lock을 획득할 수 없었기 때문에 waiting은 발생했을 것인데 그 상세한 부분에 대해 알 수가 없어서 클럽분들께 도움을 구해봅니다.
DB 환경은 ORACLE 10gr2이고 서버는 RHEL5 입니다.