Spring事务在RuntimeException上回滚

时间:2018-07-19 15:19:16

标签: java spring spring-boot spring-transactions

我有一个事务方法,我想调用另一个可能引发RuntimeException的方法。

问题在于,仅在引发异常时,事务才会被标记为rollbackOnly。

另一个方法调用本身位于try-catch块中,但是我认为当另一个方法通过抛出异常返回时,事务会被标记。

示例:

MyService.java

@Service
public class MyService {

    @Autowired
    private MyUtils utils;

    @Autowired
    private MyCrudRepository repository;

    @Transactional
    public void publicMethod() {
       try {
           utils.otherPublicMethod();
       } catch (Exception ex) {
           ex.printStackTrace();
       }

       // RollbackException: Transaction marked as rollbackOnly
       // Even though I caught the exception from the method call itself
       repository.save(new MyEntity());
    }
}

MyUtils.java

@Component
public class MyUtils {

    // Does not use transactions, repositories
    // But I think it inherits the transaction and marks it as rollbackOnly
    public void otherPublicMethod() {

        // Maybe this is seen as an uncaught exception
        throw new RuntimeException();
    }
}

编辑:

我认为这不是Does Specifying @Transactional rollbackFor Also Include RuntimeException的重复,因为最终会捕获到异常。
该问题可能相似,因为它还涉及事务和回滚。

1 个答案:

答案 0 :(得分:0)

注释@Transactional具有诸如rollbackForno-rollback-for之类的参数,您可以使用它们来说明哪些异常将导致或将不会导致回滚。例如,您可以编写:

@Transactional(rollbackFor = {RuntimeException.class})

这将导致在RuntimeException上回滚。但是,我相信RuntimeException默认会导致回滚。因此,您可能必须在no-rollback-for子句中指定此异常。 有关详细信息,请参见Transaction Management并查找“ 16.5.5设置”段落