@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并不会进行事务回滚
结论:
- @Transactional会对runtime异常进行自动回滚(异常没有被catch掉)
- 如果try-catch,要想进行事务回滚,则throw抛出个异常,事务则会执行。否则事务将不会进行回滚
- @Transactional(rollbackFor = Exception.class),可以指定回滚异常,异常会对抛出指定异常时做事务回滚