@Transactional配置详解

1、事务的7种属性

PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。,默认配置,也是常用的选择。
PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

@Transactional的默认配置是PROPAGATION_REQUIRED,源码如下:



2、每个配置的作用

注:类内部方法调用类内部的其他方法,子方法并会不引起事务行为,所以以下用两个类中的两个方法进行讲解事务。

SerivceA中的方法methodA,ServiceB中的方法methodB

  • PROPAGATION_REQUIRED

如果当前有事务,则按照当前事务处理;如果当前没有事务,就新建一个事务。

例如methodA中调用methodB,methodB的事务配置为PROPAGATION_REQUIRED,那么如果methodA方法上有事务,那么methodB发现methodA有事务,则不会再创建事务,直接事务使用methodA的事务。如果methodA方法上没有事务,那么methodB会自己创建一个事务,只对methodB方法体中加入事务管理。

  • PROPAGATION_SUPPORTS 

如果当前有事务,则按照当前事务处理;如果当前没有事务,就按照没有事务处理。

例如methodA中调用methodB,methodB的事务配置为PROPAGATION_SUPPORTS,那么如果methodA方法上有事务,那么methodB直接事务使用methodA的事务。如果methodA方法上没有事务,那么methodB方法体中也没有事务。

  • PROPAGATION_MANDATORY

如果当前有事务,则按照当前事务处理;如果当前没有事务,就抛出异常。

例如methodA中调用methodB,methodB的事务配置为PROPAGATION_MANDATORY,那么如果methodA方法上有事务,那么methodB直接事务使用methodA的事务。如果methodA方法上没有事务,那么直接抛出异常。

  • PROPAGATION_REQUIRES_NEW

不管当前是否有事务,都新建一个新的事务。

例如methodA中调用methodB,methodB的事务配置为PROPAGATION_REQUIRED_NEW,那么如果methodA方法上有事务,那么执行到methodB直接新建一个事务,把methodA的事务挂起,等待methodB的事务执行完毕,再进行执行methodA的事务。这样就存在两个事务,如果methodB已经提交,那么methodA失败回滚,methodB是不会回滚的;如果methodB失败回滚,他抛出的异常被DemoServiceA.demoMethodA捕获,methodA事务仍然可以提交。如果methodA方法上没有事务,那么新建事务执行。

  • PROPAGATION_NOT_SUPPORTED

不管当前是否有事务;都按照没有事务处理。

例如methodA中调用methodB,methodB的事务配置为PROPAGATION_NOT_SUPPORTED,那么如果methodA方法上有事务,那么执行到methodB时,methodA的事务挂起,methodB按照无事务处理,执行完后在执行methodA。如果methodA方法上没有事务,直接methodB方法体中也没有事务。

  • PROPAGATION_NEVER

如果当前有事务,则抛出异常;如果当前没有事务,就按照没有事务正常执行。

例如methodA中调用methodB,methodB的事务配置为PROPAGATION_NEVER,那么如果methodA方法上有事务,那么直接抛出异常。如果methodA方法上没有事务,那么按照没有事务正常执行。

  • PROPAGATION_NESTED

我认为和PROPAGATION_REQUIRED基本一致,有详细了解过的可以补充。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值