spring声明式事务@Transaction的避坑指南(一)

在spring框架下开启事务, 直接在类或者方法上加伤Transaction注解, 简单粗暴. 但是实际上却有很多坑需要注意.

一号坑:

Transaction并不是在捕捉到任何异常时都会执行回滚.

@Transaction注解的默认捕捉异常是RunTimeException

我们首先需要知道, 异常分为两类: 运行时异常和非运行时异常:

1. 运行时异常包括: RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等.
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理, 当出现这样的异常时,总是由虚拟机接管。
2.非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。
对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。

 

也就是说, 在默认情况下, @Transaction是不会处理非运行时异常的.

如果需要在出现 非运行时异常 时 也让事务进行回滚, 有以下两种方法:

1. 设置@Transaction的rollbackFor为指定的异常, 如果需要保函所以异常, 可以指定为Excetion:

    @Transactional(rollbackFor=Exception.class)

2. 由于非运行时异常. 必须由用户进行抛出或者捕捉, 可以在try/catch中手动抛出一个异常(RuntimeException类或子类异常), 比如一些自定义的继承RuntimeException的异常

3. 遵循阿里规约: 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值