云笔记项目-Spring事务学习-传播NEVER

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

Service层

Service层中设置事务传播属性都为NEVER。

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  * 测试Never
13  * @author yangchaolin
14  *
15  */
16 @Component("neverTest")
17 public class NeverTest {
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 testNeverWithoutTransaction1(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 testNeverWithoutTransaction2(EMP emp1,EMP emp2) {
38         service1.addEmp1(emp1);
39         service2.addEmp2WithException(emp2);//就算方法里有异常,也提交了
40     }
41     /**
42      * 外层方法有事务,并且抛出异常
43      * @param emp1
44      * @param emp2
45      */
46     @Transactional
47     public void testNeverWithTransaction1(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
58     public void testNeverWithTransaction2(EMP emp1,EMP emp2) {
59         service1.addEmp1(emp1);
60         service2.addEmp2(emp2);
61     }
62     
63 }

测试代码

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

测试结果

(1)外层方法没有事务

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

结论:当外层方法没有事务时,才能正常执行。并且不管内层方法有没有抛出异常,事务都提交了,所以定义了NEVER传播属性后,将以非事务方式来执行方法。

(2)外层方法有事务

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

执行报错:"Existing transaction found for  transaction marked with propagation 'never' "。

结论:当业务方法事务传播属性定义为NEVER时,只要外层方法有事务,执行就会报错,提示外层方法存在有事务,但是内层方法事务被标记为传播属性NEVER,导致无法执行。因此这种设置不会插入数据,只要执行就报错。

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

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