2010-12-17 2 views
3

유적 내가 가지고있는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 공급자는 최대 절전 모드입니다.

+0

정보가 충분하지 않거나 문제를 명확하게 설명하지 않았습니다. outer() btw에서 재귀 호출이 있습니까? – maximdim

+0

끝에 정확한 설명을 추가했습니다. outer()는 재귀 적으로 자신을 호출하고 middle()도 호출합니다. inner()는 재귀 적으로 자신을 호출하지 않습니다. – Pace

답변

1

글쎄, 잠시 후, 나는 대답이 '아니오'라고 생각합니다. 언제든지 OLE를 잡으려면 새 트랜잭션을 시작해야합니다. 중간에 OLE를 잡을 필요가 없도록 코드를 재구성했습니다.

관련 문제