유적 내가 가지고있는OptimisticLockException는 외부 거래를
public void outer() {
try {
middle()
} catch (OLE) {
updateEntities();
outer();
}
}
@Transactional
public void middle() {
try {
inner()
} catch (OLE) {
updateEntities();
middle();
}
@Transactional
public void inner() {
//Do DB operation
}
inner()
이 모두 middle()
및 inner()
트랜잭션 이유 인 다른 비 트랜잭션 방법에 의해 호출되는 코드 (OLE = OptimisticLockException)
... 다음. 보시다시피 엔티티를 업데이트하고 작업을 다시 시도하여 OLE를 처리합니다.
내가 가지고있는 문제는 이런 방식으로 설계 할 때 트랜잭션을 종료 할 때 OLE를 얻을 수있는 유일한 시간이라고 가정하고있었습니다. inner()
에 대한 호출이 스택이 outer()->middle()->inner()
인 경우에도 OLE를 던지고 있기 때문에 이것은 분명히 사실이 아닙니다.
이제 middle()
이 OLE를 제대로 처리하고 재 시도가 성공하지만 트랜잭션을 닫을 시간이되면 봄까지 rollbackOnly
으로 표시됩니다. middle()
메서드 호출이 finally 문을 반환하면 rollbackOnly
이라고 표시된 트랜잭션을 커밋 할 수 없기 때문에 닫기 애스펙트가 예외를 throw합니다.
나는 무엇을해야할지 잘 모르겠다. rollbackOnly
상태를 지울 수 없습니다. 내 성능을 죽이기 때문에 내부 호출에 대한 트랜잭션을 강제로 생성하고 싶지 않습니다. 나는 뭔가를 놓치고 있습니까? 아니면 다른 사람이 이것을 다르게 구성 할 수있는 방법을 볼 수 있습니까?
편집 : 내가 무엇을 요구하는지 명확히하기 위해, 나의 주요 질문을 설명하겠습니다. @Transactional 메서드 안에 있다면 OLE를 잡아서 처리 할 수 있습니까?
FYI : 트랜잭션 관리자는 JpaTransactionManager이고 JPA 공급자는 최대 절전 모드입니다.
정보가 충분하지 않거나 문제를 명확하게 설명하지 않았습니다. outer() btw에서 재귀 호출이 있습니까? – maximdim
끝에 정확한 설명을 추가했습니다. outer()는 재귀 적으로 자신을 호출하고 middle()도 호출합니다. inner()는 재귀 적으로 자신을 호출하지 않습니다. – Pace