Spring事务管理

Spring提供了很简单、很便捷的事务管理方式,通过Transaction注解,即可实现事务处理。

但是在使用中,也需要注意一些关键点。

1、必须是spring proxy的对象,才会触发事务(@Transaction注解才会生效)。

比如:Class A,里面有方法 method1和method2,两个方法均注解了@Transaction

@Transactional(propagation = Propagation.NEVER)
public void getDeps(long ID) {
    System.out.println(databaseImp.getDepartmentByID(ID));
}

@Transactional(propagation = Propagation.REQUIRED)
public void allProcessOnDB_second(long ID) {
    getDeps(ID);
    operation(ID);
}

@Transactional
public void operation(long id){
    System.out.println(databaseImp.getDepartmentByID(id));
}

上面这段代码,在同一个class中,会发现即使设置了Propagation.NEVER,也不会抛出异常。

因为在同一个class内部的方法之间的调用,并没有经过spring proxy,所以不会触发事务。

(可以理解为,同一个class内部,方法之间的调用,在经过代码编译后,所有代码都是在同一个代码块中执行的,并不需要经过spring proxy,故也不会触发@Transaction注解的事务管理)

如果将getDeps方法放在另一个class中,在allProcess方法中调用xxx.getDeps方法,此时就会抛出异常。

2、Transaction事务的传递机制

默认情况,我们都是直接使用@Transactional注解,即可使用事务。但是当出现一些特殊情况时,就不能简单这么使用了。

比如,有些情况,我们需要在method1调用method2的情况下,method2作为单独的事务提交,method1出现异常回滚,不影响method2的提交。

此时,就需要用到PROPAGATION_REQUIRES_NEW模式。

Spring事务具体的模式有7类,具体的可以参考下面的文章。

做了一些小实验,结果如下:(NEST模式,开发环境不支持,暂时没实验)

场景:Class A里面的方法method1,调用Class B里面的方法method2

  • method1 是默认Transaction,method2 是默认的Transaction

    任意方法抛出异常,则回滚(两个方法在同一个事务下)

  • method1是默认Transation,method2是PROPAGATION_NEVER

    运行异常,因为method2不能以事务运行,但是检测到在method1的事务下了。

  • method1是默认Transaction, method2是PROPAGATION_NOT_SUPPORT

    method1发生异常,method2不影响,提交成功,method1回滚

    method2发生异常,method2不影响,提交成功,method1回滚

  • method1是默认,method2是PROPAGATION_REQUIRES_NEW

    method1发生异常,method2提交,method1回滚

    method2发生异常,method2回滚,如果method1没有try catch,则回滚,否则提交

注意:对于使用PROPAGATION_REQUIRES_NEW的情况下,method2是无法获取method1中还未提交的数据的,因为两者是相互独立的事务。

对于使用PROPAGATION_NOT_SUPPORT的情况,也是无法获取未提交的数据的,因为method2不在method1的事务里。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金融码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值