취급 적절한 최대 절전 모드 중첩 된 트랜잭션

안드레이 치오 바누 :

내가 뭔가를 놓친 거지 확신합니다,하지만 난 정확히 모르겠어요 ...

다음 코드주기 :

@Service
public class MyClass {
    private MyClass self;
    private UserRepository userRepository;
    private ApplicationContext applicationContext;

    @PostConstruct
    private void init() {
        self = applicationContext.getBean(MyClass.class);
    }

    @Transactional
    public void doA(User user) {
        ...
        if (condition) {
            self.doB(user);
            throw new SecurityException();
        }
        user.setRandomField("x");
        userRepository.save(user);
    }

    @Transactional(value = Transactional.TxType.REQUIRES_NEW)
    public void doB(User user) {
        ...
        userRepository.save(user);
    }
}

나는 무엇에 대해 알고 @Transactional그것을 사용하는 경우, 전화를 중복 때문이다 repository.save(entity).

내가 뭘하려고 오전, 트랜잭션 방법에서 개체를 처리하는 것이며, 파괴 조건이있는 경우, (주석 새로운 메소드를 호출 REQUIRES_NEW엔티티의 일부 필드를 업데이트하고 저장합니다). 루트 방법 ( doA)는 예외를 던진다. 참고로 다음은 @Transactional(dontRollbackOn = SecurityException.class)이 상황에서 옵션을 선택하지 않습니다.

하나의 방법으로 새로운 빈을이 커밋 메커니즘을 사용하는 대신 작성을 위해 난 그냥 단지라는 변수에 현재 빈을 주입 self그러므로 내가 트랜잭션 관리를위한 빈 프록시를 사용할 수 있습니다.

이상한 것은 내가에서 제거 나는 경우이다 전화, 트랜잭션이 때문에의 롤백 할됩니다 에 의해 수행 된 변경 사항이 아니라 롤백 할 수 있습니다. 내가 거기에서 그것을 할 경우 예상하지만,이 노력하고 있습니다.doBsavedoASecurityExceptiondoB

내가 뭔가 잘못하고있는 중이 아니면 내가 뭔가를 놓친 거지?

감사!

StanislavL :

DOB의 사용자 인스턴스를 통과하지보십시오 (). 대신 ID를 전달하고 내부의 repo에서 사용자를 참조하십시오. 나는 첨부 된 개체가 다른 세션 사이에 처리하는 방법을 모르겠습니다.

추천

출처http://10.200.1.11:23101/article/api/json?id=389534&siteId=1