@Transactional事务回滚包含try-catch的区别

1. 不使用try-catch

查询结果:由于第二条插入语句报错,所以进行了事务回滚。

2. 使用try-catch

  2. 1. 有try-catch,没有throw异常


查询结果:通过数据库查询结果发现第一条数据插入成功,第二条失败!事务没有进行回滚

  2. 2. 有try-catch 并throw抛出异常


查询结果:由于第二条插入语句报错,虽然catch,但是在catch中throw抛出了异常,所以进行了事务回滚。

3. 第2种情况:有try-catch,指定事务的回滚类型,如@Transactional(rollbackFor = Exception.class)

通过数据库查询结果发现第一条数据插入成功,第二条失败!事务没有进行回滚。
注意:@Transactional只能对runtime异常进行回滚。如@Transactional(rollbackFor = Exception.class)只是对所有异常进行回滚,包括非runtime异常。如果catch后没有抛出异常,@Transactional并不会进行事务回滚

结论:

  1. @Transactional会对runtime异常进行自动回滚(异常没有被catch掉)
  2. 如果try-catch,要想进行事务回滚,则throw抛出个异常,事务则会执行。否则事务将不会进行回滚
  3. @Transactional(rollbackFor = Exception.class),可以指定回滚异常,异常会对抛出指定异常时做事务回滚
posted @ 2020-08-08 19:20  风去影无踪  阅读(2293)  评论(0编辑  收藏  举报