ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

事务的7种传播行为

2021-04-08 09:31:52  阅读:364  来源: 互联网

标签:事务 Propagation REQUIRED 传播 PROPAGATION add 当前 行为


一、什么是事务传播行为?
事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何运行。

例如:methodA方法调用methodB方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。

 
二、事务的7种传播行为
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。
事务传播行为是Spring框架独有的事务增强特性。
7种:(required / supports / mandatory / requires_new / not supported / never / nested)

PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,这是最常见的选择,也是Spring默认的事务传播行为。(required需要,没有新建,有加入)
PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。(supports支持,有则加入,没有就不管了,非事务运行)
PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。(mandatory强制性,有则加入,没有异常)
PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。(requires_new需要新的,不管有没有,直接创建新事务)
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。(not supported不支持事务,存在就挂起)
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。(never不支持事务,存在就异常)
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。(nested存在就在嵌套的执行,没有就找是否存在外面的事务,有则加入,没有则新建)
对事务的要求程度可以从大到小排序:mandatory / supports / required / requires_new / nested / not supported / never

 

三、实战
1、外围无事务,内部有事务,外围管不着内部
   

@Test
    void test_PROPAGATION_REQUIRED() {
        // add方法 @Transactional(propagation = Propagation.REQUIRED)
        userService.add(user);
 
        // add方法 @Transactional(propagation = Propagation.REQUIRED)
        userRoleService.add(userRole);
 
        //抛异常,不影响上面的add方法执行,外部异常不影响内部
        throw new RuntimeException();
    }


2、描述

外围方法Propagation.REQUIRED
内部方法Propagation.REQUIRED
修饰的内部方法会加入到外围方法的事务中
内部方法和外围方法均属于同一事务,只要一个方法回滚,整个事务均回滚
   

@Transactional  // 默认Required
    @Test
    void test_PROPAGATION_REQUIRED() {
 
        // 增加用户表 Required 加入了外部事务
        userService.add(user);
 
        // 增加用户角色表 Required 加入了外部事务
        userRoleService.add(userRole);
 
        //抛异常 所有都回滚
        throw new RuntimeException();
    }


3、描述

支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行
外围方法没有开启事务,add方法直接无事务执行
   

 @Test
    void test_PROPAGATION_SUPPORTS() {
        // 增加用户表 @Transactional(propagation = Propagation.SUPPORTS)
        userService.add(user);
 
        // 增加用户角色表 @Transactional(propagation = Propagation.SUPPORTS)
        userRoleService.add(userRole);
 
        //抛异常,当前无事务,直接无事务执行
        throw new RuntimeException();
    }


4、描述

外围加入事务,默认Propagation.REQUIRED
内部使用Propagation.SUPPORTS
内部发现有事务,加入,外部异常,内部回滚


5、描述

支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常
外围不存在事务
内部add方法使用@Transactional(propagation = Propagation.MANDATORY)
内部发现当前没事务,直接抛出异常
 

标签:事务,Propagation,REQUIRED,传播,PROPAGATION,add,当前,行为
来源: https://blog.csdn.net/u011526721/article/details/115503604

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有