2009-07-20 5 views
3

내 응용 프로그램 테스트가 데이터베이스에서 상당히 어렵습니다. 테이블 문 작성, 삭제 및 변경을 실행합니다. 그러나, 나는 여전히 postresql이 교착 상태 (즉, 잠금을 감지하고 한 스레드를 밖으로 내 보낸다)의 경우에도이를 처리 할 것으로 기대합니다. 동시에 요청을 실행하지 않습니다.PostgreSQL 단독 잠금이 응용 프로그램을 중지합니다.

그러나, 내 경우에는 단지 멈추고 수동으로 제거해야합니다 (약간 달리기 순서를 변경하면 작동하지만 이것은 나에게 자신감을주지 않습니다). 잠금은 create table 문에 배타 잠금이 있고 트랜잭션에도 배타 잠금이 있음을 보여줍니다.

비슷한 경험이 있습니까? 도움을 줄 수있는 서버 설정이 있습니까? 아니면 그냥 조언?

답변

7

PostgreSQL은 자동으로 데드락을 감지합니다. 대부분의 경우, 완료되지 않은 어딘가의 문장에서만 차단됩니다. 데드락은 두 개의 명령문이 서로를 기다리고있는 경우에만 발생합니다.

"잠금 트리"를 루트 (차단에 대한 차단은 루트에 있음)로 검사하면 실행 시간이 오래 걸리는 트랜잭션을 찾을 가능성이 높습니다. 제대로 커밋되지 않았지만 "유휴 상태"모드에 있습니다.

스레드를 언급 했으므로 모든 클라이언트 라이브러리가 반드시 클라이언트 측에서 스레드 안전성을 갖지는 않습니다.

+1

감사합니다. 그것은 트랜잭션의 유휴 상태였습니다. http://wiki.dspace.org/index.php/Idle_In_Transaction_Problem은 트랜잭션 발생 원인을 디버깅하는 데 도움을주었습니다. 그래도 아직 % 100에 해당하지 않을지라도 agian이 발생하지는 않습니다. –