먼저, 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
으로 변경해야한다고 생각했지만 기능의 롤백 동작이 유지되지 않습니다.
나는 약간의 상실감이 있으므로 어떤 도움을 주셔서 감사합니다!