在Spring中发生的SQL异常可以触发事务回滚的原因

在对Spring的事务回滚捕获的异常类型进行测试,发现当出现SQL异常时可以触发事务回滚,但是通过查看文档发现,Java.lang.SQLExcepetion是Java.lang.Excepetion的子类,在没有对事务设置rollbackfor=Exception.class时是不会默认对捕获的Excepetion类型异常触发事务回滚操作,而实际情况却与此相反,触发了事务回滚。

经过查阅相关资料,文章https://blog.csdn.net/qq_32331073/article/details/76525372对该问题进行了详细的解答。

文章中说到在项目开发中引入了spring框架后,SQLExcepetion被org.springframework重写,经过重写后涉及到dao的异常都是java.lang.RuntimeException的子类。因此事务回滚才会发生。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以,@Transactional注释将自动回滚抛出的检查型异常,这些异常包括所有继承自java.lang.Exception异常,但不包括继承自java.lang.RuntimeException异常。 ### 回答2: 在Java,被捕获的异常默认情况下是不会触发@Transactional事务回滚的。事务回滚是通过抛出未被捕获的RuntimeException或Error类型的异常触发的。而被捕获的异常会被处理掉,不会传播到事务管理器,所以事务不会回滚。 然而,如果在捕获到异常后手动抛出RuntimeException或Error类型的异常,那么事务将会回滚。这是因为RuntimeException和Error类型的异常被认为是无法修复的严重错误,需要止当前的事务并执行回滚操作。 因此,在Java,如果希望被捕获的异常触发@Transactional事务回滚,可以在捕获异常后手动抛出RuntimeException或Error类型的异常。这样事务管理器会捕获到这个未被处理的异常,并执行事务回滚操作。 ### 回答3: 在Java,被捕获的异常可以触发@Transactional事务回滚。@Transactional是Spring框架的注解,用于标记一个方法或类应该作为一个事务进行管理。当方法内部发生异常时,如果该方法被@Transactional注解修饰,Spring会对该方法进行事务处理。 当一个被@Transactional注解修饰的方法发生异常时,Spring会将当前方法事务标记为回滚,并且会将异常重新抛出给上层调用者。如果上层调用者也没有捕获该异常并处理,则上层调用者也会触发事务回滚。这种回滚策略的关键在于异常的传播性,即异常会沿着调用链逐级向上抛出,直到被捕获或到达事务边界。 如果被捕获的异常事务范围内被捕获并处理,那么事务就不会回滚。只有当异常没有被捕获或没有事务边界包裹时,事务才会回滚。因此,在Java,被捕获的异常可以触发@Transactional事务回滚,但这取决于异常在何处被捕获和处理。为了保证事务的完整性,建议在捕获异常时,要么重新抛出异常触发事务回滚,要么在捕获异常后手动触发事务回滚,以确保数据的一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值