2011-09-04 3 views
1

명시 적 테이블 잠금을 사용하지 않고 내 격리 수준이 READ COMMITTED으로 설정되어 있어도이 오류가 발생합니다. Message: ORA-00060: deadlock detected while waiting for resource명시 적 잠금 및 커밋 된 격리 수준 읽기가없는 Oracle 교착 상태, 이유는 무엇입니까?

기본 전달을 사용하여 스프링 TransactionTemplate 이상의 여러 스레드를 사용합니다. 내 비즈니스 로직에서 데이터는 분리되어 있으므로 두 트랜잭션은 결코 동일한 데이터 집합을 갖지 않습니다. 그럴 필요가 없습니다 SERIALIZABLE

오라클은 왜 교착 상태를 감지 할 수 있습니까? 교착 상태는이 별자리에서 불가능합니다. 또는 나는 무엇인가 놓치고 있습니까? 내가 뭔가를 놓치지 않는다면 분리 알고리즘이 틀렸을 것입니다. 맞습니까? 아니면 다른 설명이 될 수 있습니까?

+1

오라클이 교착 상태를 감지하면 교착 상태 추적 파일이 생성됩니다. 해당 파일을 가져올 수 있습니까 (또는 DBA에게 요청할 수 있습니까)? 여러 가지 가능성이 있지만 교착 상태 추적 파일에 정확한 결과가 표시됩니다. –

답변

4

기본적으로 Oracle은 행 수준 잠금을 수행합니다. 여러 스레드를 사용하여 언급. 한 스레드가 한 행을 잠근 다음 다른 스레드가 잠근 다른 스레드를 잠그고있는 것으로 의심됩니다. 그런 다음 다른 스레드가 첫 번째 스레드를 잠근 행을 잠그려고합니다. 이 시점에서 오라클은 자동적으로 교착 상태를 감지하고이를 중단시킵니다. 위에서 언급 한 두 행은 동일한 테이블 또는 다른 테이블에있을 수 있습니다.

각 스레드가 수행중인 작업을 신중하게 검토하는 것이 출발점입니다. 병렬로 실행하지 않기로 결정하거나 명시 적 잠금 메커니즘 (예 : 업데이트 선택)을 사용해야 할 수도 있습니다.

LMK 및 추가 질문이 있습니다.

K

+0

좋아, 그 덤프를 찾아 보겠다. 그러나 좀 더 일반적인 관점에서 볼 때, 나는 분리 된 논리적 척을 스레드에 제공합니다. 따라서이 코드 조각은 분명히 망가져 있어야하고, 디졸브 척이 아닌 사람을 제공해야합니까? –

+0

각 스레드가 서로 다른 테이블을 만지면 문제가 더 재미 있습니다. 저스틴과 스티브가 제시 한 추적 파일로 시작하는 것이 가장 좋은 다음 단계입니다. –

1

만남 교착 상태는 직렬화 수준 자체는 아무 상관이 없습니다. 행이 삽입/업데이트/삭제되면 오라클이 행을 잠급니다. 동시에 두 개의 트랜잭션이 실행 중이고 동일한 행을 변경하려는 경우 교착 상태가 발생할 수 있습니다. "CAN"에 중점을 둡니다. 이것은 일반적으로 다른 유형의 트랜잭션이 다른 순서로 잠금을받는 경우 발생합니다. 이는 잘못된 트랜잭션 설계의 징조입니다.

앞에서 설명한 것처럼 교착 상태가 발생하면 추적 파일이 생성됩니다. 추적 파일을 보면, 두 개의 세션이 교착 상태에 관련되어 있는지 판별 할 수 있습니다. 또한 각 SQL 문을 보여줍니다.