1

먼저, JPA2 임 플리 멘 테이션으로 Spring + Hibernate를 사용하고 있습니다. 내 응용 프로그램은 JpaTransactionManager 및 HibernateJpaDialect로 구성됩니다.원 자성을위한 중첩 된 트랜잭션 (Propogation.REQUIRED_NEW/Propogation.NESTED)

나는 장치를 비활성화하는 기능이 있으며 여러 장치를 비활성화하는 기능이 있습니다. 유닛 비활성화 작업은 외부 서비스를 호출하고 해당 호출이 시간 초과되거나 오류 상태와 함께 반환되면 예외를 throw합니다. 단일 유닛 비활성화가 실패하면 (이 외부 서비스 호출을 통해 또는 RuntimeException으로 인해) 에 대한 트랜잭션을 롤백하려는 경우 유닛 만 해당됩니다.

@Transactional 
public void deactivateUnits(List<String> names){ 
    for(String name : names){ 
     deactivateUnit(name); 
    } 
} 
@Transactional(propogation=Propogation.REQUIRES_NEW, rollbackFor=MyException.class) 
public void deactivateUnit(String name) throws MyException{ 
    ..snip.. 
    //Some code that throws MyExceptions or RuntimeExceptions 
    ..snip.. 
} 

그리고 이것은 완벽하게 잘 작동합니다

나는 다음과 같이 기본적으로이 사용 Propogation.REQUIRES_NEW을 달성 할 수 있어요.

이 스타일은 활성화에 대해서도 잘 확장됩니다.

@Transactional 
public void activateUnits(List<String> names){ 
    for(String name : names){ 
     activateUnit(name); 
    } 
} 
@Transactional(propogation=Propogation.REQUIRES_NEW, rollbackFor=MyException.class) 
public void activateUnit(String name) throws MyException{ 
    ..snip.. 
    //Some code that throws MyExceptions or RuntimeExceptions 
    ..snip.. 
} 

그러나 때가되면 문제가 발생합니다. reactivation. 내가 원했던 것은 deactivateUnit과 함수를 사용하는 원자 reactivation 작업입니다. deactivateUnit 또는 activateUnit 중 하나가 롤백을 일으키는 경우 전체 함수가 롤백됩니다. 이것

내 naiive 시도가 작동하지 않습니다

@Transactional(propogation=Propogation.REQUIRES_NEW, rollbackFor=MyException.class) 
public void reactivateUnit(String newName, String oldName) throws MyException{ 
    deactivateUnit(oldName); 
    activateUnit(newName); 
} 

activateUnit하면 롤 다시 deactivateUnit하지 않습니다.

활성화 및 비활성화에 대한 전파를 NESTED으로 변경해야한다고 생각했지만 기능의 롤백 동작이 유지되지 않습니다.

나는 약간의 상실감이 있으므로 어떤 도움을 주셔서 감사합니다!

답변

0

이 경우 원래 주석이 달린 deactivateUnit 함수를 사용할 수있을 것 같지 않습니다. REFERIRES_NEW가 붙지 않은 헬퍼 함수를 ​​호출하는 래퍼 함수를 ​​사용해야 할 수도 있습니다. 그런 다음 reactivateUnit 메소드에서 도우미 함수를 호출 할 수도 있습니다.