zoukankan      html  css  js  c++  java
  • 云笔记项目-Spring事务学习-传播NESTED

    接下来测试事务传播属性NESTED

    Service层

    Service层方法事务传播属性都设置为NESTED。

    LayerT层代码

     1 package LayerT;
     2 
     3 import javax.annotation.Resource;
     4 
     5 import org.springframework.stereotype.Component;
     6 import org.springframework.transaction.annotation.Transactional;
     7 
     8 import Entity.EMP;
     9 import Service.EMPService1;
    10 import Service.EMPService2;
    11 /**
    12  * 测试Nested
    13  * @author yangchaolin
    14  *
    15  */
    16 @Component("nestedTest")
    17 public class NestedTest {
    18     @Resource(name="service1")
    19     EMPService1 service1;
    20     @Resource(name="service2")
    21     EMPService2 service2;
    22     /**
    23      * 外层方法没有事务,但是抛出异常  
    24      * @param emp1
    25      * @param emp2
    26      */
    27     public void testNestedWithoutTransaction1(EMP emp1,EMP emp2) {
    28         service1.addEmp1(emp1);
    29         service2.addEmp2(emp2);
    30         throw new RuntimeException();
    31     }
    32     /**
    33      * 外层方法没有事务,内层方法抛出异常
    34      * @param emp1
    35      * @param emp2
    36      */
    37     public void testNestedWithoutTransaction2(EMP emp1,EMP emp2) {
    38         service1.addEmp1(emp1);
    39         service2.addEmp2WithException(emp2);
    40     }
    41     /**
    42      * 外层方法有事务,并且抛出异常
    43      * @param emp1
    44      * @param emp2
    45      */
    46     @Transactional //默认为传播属性为Required
    47     public void testNestedWithTransaction1(EMP emp1,EMP emp2) {
    48         service1.addEmp1(emp1);
    49         service2.addEmp2(emp2);
    50         throw new RuntimeException();
    51     }
    52     /**
    53      * 外层方法有事务,内层方法抛出异常
    54      * @param emp1
    55      * @param emp2
    56      */
    57     @Transactional //默认为传播属性为Required
    58     public void testNestedWithTransaction2(EMP emp1,EMP emp2) {
    59         service1.addEmp1(emp1);
    60         service2.addEmp2WithException(emp2);
    61     }    
    62     /**
    63      * 外层方法有事务,内层方法抛出的异常被捕获
    64      * @param emp1
    65      * @param emp2
    66      */
    67     @Transactional //默认为传播属性为Required
    68     public void testNestedWithTransaction3(EMP emp1,EMP emp2) {
    69         service1.addEmp1(emp1);
    70         try {
    71         service2.addEmp2WithException(emp2);
    72         }catch(Exception e) {
    73             System.out.println("回滚");
    74         }
    75     }   
    76 }

    测试代码

     1 package TestCase;
     2 
     3 import org.junit.Test;
     4 
     5 import Entity.EMP;
     6 import LayerT.NestedTest;
     7 import LayerT.RequiredTest;
     8 
     9 public class nestedTestCase extends baseTest{
    10     @Test
    11     public void test1() {
    12         NestedTest T1=ac.getBean("nestedTest",NestedTest.class);
    13         EMP emp1=new EMP("张三",18);
    14         EMP emp2=new EMP("李四",28);
    15         T1.testNestedWithoutTransaction1(emp1, emp2);
    16       }    
    17     @Test
    18     public void test2() {
    19         NestedTest T1=ac.getBean("nestedTest",NestedTest.class);
    20         EMP emp1=new EMP("张三",18);
    21         EMP emp2=new EMP("李四",28);
    22         T1.testNestedWithoutTransaction2(emp1, emp2);
    23       }    
    24     @Test
    25     public void test3() {
    26         NestedTest T1=ac.getBean("nestedTest",NestedTest.class);
    27         EMP emp1=new EMP("张三",18);
    28         EMP emp2=new EMP("李四",28);
    29         T1.testNestedWithTransaction1(emp1, emp2);
    30       }    
    31     @Test
    32     public void test4() {
    33         NestedTest T1=ac.getBean("nestedTest",NestedTest.class);
    34         EMP emp1=new EMP("张三",18);
    35         EMP emp2=new EMP("李四",28);
    36         T1.testNestedWithTransaction2(emp1, emp2);
    37       }    
    38     @Test
    39     public void test5() {
    40         NestedTest T1=ac.getBean("nestedTest",NestedTest.class);
    41         EMP emp1=new EMP("张三",18);
    42         EMP emp2=new EMP("李四",28);
    43         T1.testNestedWithTransaction3(emp1, emp2);
    44       }    
    45 }

    测试结果:

    (1)外层方法没有事务

    test1 张三插入,李四插入
    test2 张三插入,李四未插入

     

    结论:在外层方法没有事务声明的情况下,内层方法事务传播属性为NESTED时,类似REQUIRED,内层方法之间事务相互独立,互不影响,如果内层方法有异常,会单独回滚自己的事务,不会影响其他事务。

    (2)外层方法有事务

    test3 张三未插入,李四未插入
    test4 张三未插入,李四未插入
    test5 张三插入,李四未插入

    结论:当外层方法声明默认事务,其传播属性为REQUIRED,内层方法事务传播属性为NESTED的情况下,内层方法事务为外层方法事务的子事务,当外层方法有异常,或者内层方法抛出异常,所以事务都需要回滚,所以test3和test4都没有插入成功。当内层方法抛出异常被捕获,只会回滚当前抛出异常的方法事务,其他子事务不受影响。

    参考博文:https://segmentfault.com/a/1190000013341344

  • 相关阅读:
    前端之 http
    事务、存储、索引与慢查询及数据库设计的三大范式
    Navcat 软件使用及 pymysql模块
    MySQL单表查询与多表查询
    IO 模型
    Unable to round-trip http request to upstream: read tcp 192.168.xx.xxx:xxxxx->xx.xxx.xxx.x:xxx: read: operation timed out
    恶补计算机基础知识(一)
    2020 年终总结
    自我总结Java并发编程基础篇(一)
    jvm系列(三):GC算法、垃圾收集器
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/10629634.html
Copyright © 2011-2022 走看看