spring事务在try catch时候的执行

本文介绍了Spring的默认事务机制,即出现unchecked异常时回滚,checked异常时不回滚。还提到使用@Transactional(rollbackFor = Exception.class)注解,若在service层用try catch捕获异常,事务不会回滚,需在catch里抛RuntimeException让事务回滚。

spring 的默认事务机制,当出现unchecked异常时候回滚,checked异常的时候不会回滚;

@Transactional(rollbackFor = Exception.class)

当有try catch后捕获了异常,事务不会回滚,如果不得不在service层写try catch 需要catch里面加 throw new RuntimeException 让事务回滚;

} catch (Exception e) {
            e.printStackTrace();
            logger.error("发生异常");
            throw new RuntimeException();
        }
### Spring 框架中 Try-Catch事务回滚的影响 在Spring框架内,`try-catch`结构确实能够影响到由`@Transactional`注解所定义的方法中的事务回滚行为。具体来说: - 默认情况下,只有未被捕捉的运行时异常(即继承自`RuntimeException`的异常)才会触发事务自动回滚[^2]。 - 如果在一个有`@Transactional`注解的方法里使用了`try-catch`来捕获异常,则取决于如何处理这个异常以及是否有额外设置。 对于已检查异常,默认情况下它们不会引起事务回滚;但是可以通过指定`rollbackFor`参数让某些类型的已检查异常也导致回滚操作。例如,在代码片段中可以看到如下配置: ```java @Transactional(rollbackFor = Exception.class) public void asyncJob() { success(); try { exception(); } catch (Exception e) { e.printStackTrace(); // 手工回滚异常 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } ``` 这段代码展示了如何利用`TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()`来进行手动回滚的操作[^3]。这使得即便是在`catch`块中处理过的异常也能使当前事务标记为只读模式从而实现回滚效果。 另外需要注意的是,如果希望整个方法执行失败后都能正常回滚而不论是否进入了`catch`分支,那么应该避免完全吞掉所有可能发生的错误而不做任何响应或记录。比如下面的例子就可能导致预期之外的行为——尽管设置了全局性的回滚条件(`rollbackFor=Exception.class`),但由于存在空返回值且没有任何日志输出或其他形式的通知机制,可能会掩盖实际发生的问题[^5]: ```java @Override @Transactional(rollbackFor = Exception.class) public CommonResponse modifyTeaFormula(GemiTeaFormulaReq gemiTeaFormulaReq) { try { /* 省略部分业务逻辑 */ teaFormulaDao.deleteById(id); teaFormulaDetailDao.deleteById(id); } catch (Exception e) { logger.error("error:" + e.getMessage()); } return new CommonResponse(0); } ``` 为了确保事务按期望工作,建议遵循最佳实践:要么允许异常传播出去以便于框架可以识别并且回滚相应的更改;要么就在适当的位置加入显式的回滚指令,并考虑增加足够的调试信息帮助后续排查问题所在。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值