云笔记项目-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

原文地址:https://www.cnblogs.com/youngchaolin/p/10629978.html