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

    接下来测试事务传播属性设置为NOT_SUPPORTED

    Service层

    Service层主要设置如下,其中还插入了REQUIRED作为比较。

     1 package Service;
     2 
     3 import javax.annotation.Resource;
     4 
     5 import org.springframework.stereotype.Service;
     6 import org.springframework.transaction.annotation.Propagation;
     7 import org.springframework.transaction.annotation.Transactional;
     8 
     9 import DAO.EmpDAO;
    10 import Entity.EMP;
    11 
    12 @Service("service1")
    13 public class EMPService1Impl implements EMPService1{
    14     
    15     @Resource(name="empDAO")
    16     EmpDAO dao;
    17     
    18     @Transactional(propagation=Propagation.NOT_SUPPORTED)
    19     public void addEmp1(EMP emp) {
    20         dao.addEMP1(emp);        
    21     }
    22 
    23 }
     1 package Service;
     2 
     3 import javax.annotation.Resource;
     4 
     5 import org.springframework.stereotype.Service;
     6 import org.springframework.transaction.annotation.Propagation;
     7 import org.springframework.transaction.annotation.Transactional;
     8 
     9 import DAO.EmpDAO;
    10 import Entity.EMP;
    11 
    12 @Service("service2")
    13 public class EMPService2Impl implements EMPService2{
    14     
    15     @Resource(name="empDAO")
    16     EmpDAO dao;
    17    
    18     @Transactional(propagation=Propagation.REQUIRED)
    19     public void addEmp2(EMP emp) {
    20         dao.addEMP2(emp);
    21     }
    22     
    23     @Transactional(propagation=Propagation.NOT_SUPPORTED)
    24     public void addEmp2WithException(EMP emp) {
    25         dao.addEMP2(emp);
    26         throw new RuntimeException();
    27     }
    28 
    29 }

    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 @Component("noteSupportedTest")
    12 public class NotSupportedTest {
    13     @Resource(name="service1")
    14     EMPService1 service1;
    15     @Resource(name="service2")
    16     EMPService2 service2;
    17     /**
    18      * 外层方法没有事务,但是抛出异常
    19      * @param emp1
    20      * @param emp2
    21      */
    22     public void testNotSupportWithoutTransaction1(EMP emp1,EMP emp2) {
    23         service1.addEmp1(emp1);
    24         service2.addEmp2(emp2);
    25         throw new RuntimeException();
    26     }
    27     /**
    28      * 外层方法没有事务,内层方法抛出异常
    29      * @param emp1
    30      * @param emp2
    31      */
    32     public void testNotSupportWithoutTransaction2(EMP emp1,EMP emp2) {
    33         service1.addEmp1(emp1);
    34         service2.addEmp2WithException(emp2);
    35     }
    36     /**
    37      * 外层方法有事务,并且抛出异常
    38      * @param emp1
    39      * @param emp2
    40      */
    41     @Transactional
    42     public void testNotSupportWithTransaction1(EMP emp1,EMP emp2) {
    43         service1.addEmp1(emp1);//not_supported
    44         service2.addEmp2(emp2);//required
    45         throw new RuntimeException();
    46     }
    47     /**
    48      * 外层方法有事务,并且内存方法抛出异常
    49      * @param emp1
    50      * @param emp2
    51      * @param emp3
    52      */
    53     @Transactional
    54     public void testNotSupportWithTransaction2(EMP emp1,EMP emp2, EMP emp3) {
    55         service1.addEmp1(emp1);//not_supported
    56         service2.addEmp2(emp2);//required
    57         service2.addEmp2WithException(emp3);//not_supported
    58     }
    59 }

    测试代码

     1 package TestCase;
     2 
     3 import org.junit.Test;
     4 
     5 import Entity.EMP;
     6 import LayerT.NotSupportedTest;
     7 
     8 public class notSupportedTestCase extends baseTest{
     9     @Test
    10     public void test1() {
    11         NotSupportedTest T1=ac.getBean("noteSupportedTest",NotSupportedTest.class);
    12         EMP emp1=new EMP("张三",18);
    13         EMP emp2=new EMP("李四",28);
    14         T1.testNotSupportWithoutTransaction1(emp1, emp2);
    15       }    
    16     @Test
    17     public void test2() {
    18         NotSupportedTest T1=ac.getBean("noteSupportedTest",NotSupportedTest.class);
    19         EMP emp1=new EMP("张三",18);
    20         EMP emp2=new EMP("李四",28);
    21         T1.testNotSupportWithoutTransaction2(emp1, emp2);
    22       }    
    23     @Test
    24     public void test3() {
    25         NotSupportedTest T1=ac.getBean("noteSupportedTest",NotSupportedTest.class);
    26         EMP emp1=new EMP("张三",18);
    27         EMP emp2=new EMP("李四",28);
    28         T1.testNotSupportWithTransaction1(emp1, emp2);
    29       }    
    30     @Test
    31     public void test4() {
    32         NotSupportedTest T1=ac.getBean("noteSupportedTest",NotSupportedTest.class);
    33         EMP emp1=new EMP("张三",18);
    34         EMP emp2=new EMP("李四",28);
    35         EMP emp3=new EMP("王五",22);
    36         T1.testNotSupportWithTransaction2(emp1, emp2, emp3);
    37       }    
    38 }

    测试结果

    (1)外层方法没有事务

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

    结论:当外层方法没有事务时,内层方法按照非事务方式执行。

    (2)外层方法有事务

    test3 张三插入,李四未插入
    test4 张三插入,李四未插入,王五插入

    结论:当外层方法事务传播属性设置为默认,只有声明REQUIRED的那个方法会受外层方法的影响,导致李四未插入,但是内层方法事务声明为NOT_SUPPORTED的方法,不论内层还是外层方法有异常,都不开启事务,出错也提交事务。

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

  • 相关阅读:
    学习winform第三方界面weiFenLuo.winFormsUI.Docking.dll
    C#中MySQL数据库的备份 还原 初始化
    winform学习笔记02
    mysql与sqlserver之间的关系转换
    mysql数据库使用
    python学习--导入自己的包
    thymeleaf 拼接 超链接
    @RequestParam与@PathVariable的区别
    ifram 实现左侧菜单,右侧显示内容
    Spring 整合Shiro:记住我
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/10629978.html
Copyright © 2011-2022 走看看