2017-09-26 60 views
1

다중 스레드 (보통 16/32)에서 실행되는 Java 배치가 있습니다. 조건 적으로 테이블에 삽입/업데이트하는 JDBC 쿼리가 있습니다.java.sql.SQLException : ORA-00060 : 리소스 대기 중 교착 상태가 감지되었습니다.

이 쿼리에서
[CobolThread 34] ERROR (com.splwg.base.support.sql.PreparedStatementImpl) Error executing update for rawSQL: 
update TABLE_A s set s.INT_COL = s.INT_COL + 1 where s.PRIM_ID = ? 
with 'string' parameter named 'primId' to : '8741104958' to indices: 1 
java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource 

에서, PRIM_ID 열이 기본 키 열이며,이 TABLE_A에 다른 인덱스가 없습니다 :

그러나, 기록의 일부 인해 다음과 같은 오류로 실패합니다. 나는이 블로그를 통해 많은 블로그를 살펴 보았고, 그들이 제안한 모두는 비트 맵 인덱스의 사용을 피하기위한 것이다. 내 경우에는 비트 맵 인덱스가 없으며 관련 외래 키도 없습니다.

참고 : 조건부 삽입/업데이트 이전에 MERGE 문을 사용했지만 동일한 이유로 실패하는 경우도있었습니다.

이 문제의 원인을 이해하기 쉽도록 도와주세요.

+0

다른 업데이트는 있습니까? 'PRIM_ID'에 외래 키 참조가있는 테이블에 대한 업데이트가 있습니까? 이것이 유일한 업데이트 인 경우 다중 스레드 코드가 둘 이상의 스레드에 동일한 ID를 할당하지 않는다는 사실을 확신합니까? –

+0

@MickMnemonic, PRIM_ID에 대한 FK 참조가 없습니다. 필자가 최근에 언급 한 또 하나의 요점은 AWR 보고서에서이 테이블에 대한 ITL 대기 여부입니다. 나는 그것에 대한 INITRANS 및 PCTFREE 매개 변수를 최적화하기 위해 노력하고 있습니다. 당신의 도움을 주셔서 감사합니다. –

+0

병렬화 코드는 어떻게 처리합니까? 스레드간에'PRIM_ID'를 어떻게 배포하고 있습니까? –

답변

0

여러 DML 명령이 동일한 데이터에 동시에 액세스하려고하면 교착 상태가 나타납니다.

Herehere이 문제에 대한 간단한 설명을 찾을 수 있습니다. 잘못 작성된 SQL 명령의 매우 일반적인 동작입니다. 나는 당신이 그것을 다시 써야한다고 생각한다.

+0

감사합니다. @HelenA 님의 답변입니다. 그러나 앞서 언급했듯이 DML 명령은 동일한 데이터에 액세스하지 않습니다. Prim_id는 업데이트 쿼리에 사용되는 고유 키입니다. 따라서 다중 스레드는 동일한 데이터에 동시에 액세스 할 수 없습니다. –