接下来测试事务传播属性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,导致无法执行。因此这种设置不会插入数据,只要执行就报错。