특정 Exception이 발생 했을 때 롤백하도록 설정하는 방법도 역시 선언적인 방법과 프로그래밍을 통한 방법이 있습니다.

선언적인 방법은 다음과 같이 rollback-for 속성을 사용하여 설정할 수 있습니다.

<tx:advice id="txAdvice" transaction-manager="txManager">
  <tx:attributes>
     <tx:method name="get*" read-only="false" rollback-for="NoProductInStockException"/>
     <tx:method name="*"/>
  </tx:attributes>
</tx:advice>

프로그래밍을 통한 방법은 다음과 같이 할 수 있습니다.

public void resolvePosition() {
    try {
        // some business logic...
    } catch (NoProductInStockException ex) {
        // trigger rollback programmatically
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}

하지만 Spring 프레임워크 코드에 종속성이 생기게 되며, Spring 코드가 침략하게 됩니다. 따라서 선언적인 방법을 사용하는 것을 권장합니다.