2021-04-09

1、 简述
        Spring开发中一个事务方法声明是用@Transactional注解,该注解属性其中最重要的是propagation,表示打算该方法以什么样的方式使用事务,是用还是不用,是用当前的还是另起新建一个事务。其中propagation有七种配置,分别是REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。如果不额外声明,则默认是REQUIRED。
 
2. Spring中七种Propagation类的事务属性详解:
 
 REQUIRED:支持当前事务,如果当前不在一个事务中,就新建一个事务。这是最常见的选择。 不声明默认是REQUIRED

 SUPPORTS:支持当前事务,如果当前不在一个事务中,就以非事务方式执行。 

 MANDATORY:支持当前事务,如果当前不在一个事务中,就抛出异常。 

 REQUIRES_NEW:新建一个事务,如果已经在一个事务中,则把当前事务挂起执行自己这个事务。 

 NOT_SUPPORTED:以非事务方式执行操作,如果已经在一个事务中,就把当前事务挂起再执行自己。 

 NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 

 NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

3、 REQUIRED

   含义:(1)当前改方法如果已经在一个事务中,就加入事务一起执行

             (2) 输入当前方法不在一个事务中,就新建一个事务执行,

      简言之,有就用,没有就新建,一定有事务

@Transactional(propagation = org.springframework.transaction.annotation.Propagation.REQUIRED, rollbackFor = Exception.class)
public void execute(DispatcherVO dispatcherVO) {...}

 

4、REQUIRES_NEW

     含义:始终会新建一故意个事务,如果当前存在事务,则把当前事务挂起,创建并开始执行自己这个事务

示例代码如下:

@Transactional(propagation = org.springframework.transaction.annotation.Propagation.REQUIRES_NEW)
	public List findUsersTrans(UserVO user, String condition)
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public String createShardingTable() {....}

 

 

 

5 事务的选择

DDL和DML和事务结合时,需要注意:

(1) 通常一个DDL的方法开始执行时,在一个事务中,则会影响当前这个事务的提交。应为DDL要求执行前将事务提交。如果DDL方法执行失败了,则会造成DDL之前的那部分事务提交了,会达到非预期的效果。

所以一般情况下,DDL方法使用REQUIRES_NEW的方式更合理一些,单开的这个事务不会影响原来的事务的提交。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值