云笔记项目-Spring事务学习-传播SUPPORTS
接下来测试事务传播属性SUPPORTS
Service层
Service层将方法的事务传播属性设置为SUPPORTS
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 * 测试Supports 13 * @author yangchaolin 14 * 15 */ 16 @Component("supportTest") 17 public class SupportedTest { 18 @Resource(name="service1") 19 EMPService1 service1; 20 @Resource(name="service2") 21 EMPService2 service2; 22 23 /** 24 * 外层方法没有事务,但是抛出异常 25 * @param emp1 26 * @param emp2 27 */ 28 public void testSupportsWithoutTransaction1(EMP emp1,EMP emp2) { 29 service1.addEmp1(emp1); 30 service2.addEmp2(emp2); 31 throw new RuntimeException(); 32 } 33 /** 34 * 外层方法没有事务,内层方法抛出异常 35 * @param emp1 36 * @param emp2 37 */ 38 public void testSupportsWithoutTransaction2(EMP emp1,EMP emp2) { 39 service1.addEmp1(emp1); 40 service2.addEmp2WithException(emp2); 41 } 42 /** 43 * 外层方法有事务,并抛出异常 44 * @param emp1 45 * @param emp2 46 */ 47 @Transactional 48 public void testSupportsWithTransaction1(EMP emp1,EMP emp2) { 49 service1.addEmp1(emp1); 50 service2.addEmp2(emp2); 51 throw new RuntimeException(); 52 } 53 /** 54 * 外层方法有事务,内层方法抛出异常 55 * @param emp1 56 * @param emp2 57 */ 58 @Transactional 59 public void testSupportsWithTransaction2(EMP emp1,EMP emp2) { 60 service1.addEmp1(emp1); 61 service2.addEmp2WithException(emp2); 62 } 63 /** 64 * 外层方法有事务,内层方法抛出异常被捕获 65 * @param emp1 66 * @param emp2 67 */ 68 @Transactional 69 public void testSupportsWithTransaction3(EMP emp1,EMP emp2) { 70 service1.addEmp1(emp1); 71 try { 72 service2.addEmp2WithException(emp2); 73 }catch(Exception e) { 74 System.out.println("回滚"); 75 } 76 } 77 }
测试代码
1 package TestCase; 2 3 import org.junit.Test; 4 5 import Entity.EMP; 6 import LayerT.SupportedTest; 7 8 public class supportsTestCase extends baseTest{ 9 @Test 10 public void test1() { 11 SupportedTest T1=ac.getBean("supportTest",SupportedTest.class); 12 EMP emp1=new EMP("张三",18); 13 EMP emp2=new EMP("李四",28); 14 T1.testSupportsWithoutTransaction1(emp1, emp2); 15 } 16 @Test 17 public void test2() { 18 SupportedTest T1=ac.getBean("supportTest",SupportedTest.class); 19 EMP emp1=new EMP("张三",18); 20 EMP emp2=new EMP("李四",28); 21 T1.testSupportsWithoutTransaction2(emp1, emp2); 22 } 23 @Test 24 public void test3() { 25 SupportedTest T1=ac.getBean("supportTest",SupportedTest.class); 26 EMP emp1=new EMP("张三",18); 27 EMP emp2=new EMP("李四",28); 28 T1.testSupportsWithTransaction1(emp1, emp2); 29 } 30 @Test 31 public void test4() { 32 SupportedTest T1=ac.getBean("supportTest",SupportedTest.class); 33 EMP emp1=new EMP("张三",18); 34 EMP emp2=new EMP("李四",28); 35 T1.testSupportsWithTransaction2(emp1, emp2); 36 } 37 @Test 38 public void test5() { 39 SupportedTest T1=ac.getBean("supportTest",SupportedTest.class); 40 EMP emp1=new EMP("张三",18); 41 EMP emp2=new EMP("李四",28); 42 T1.testSupportsWithTransaction3(emp1, emp2); 43 } 44 }
测试结果
(1)外层方法没有事务
test1 | 张三插入,李四插入 |
test2 | 张三插入,李四插入 |
结论:当内层方法事务传播属性设置为SUPPORTS时,在外层方法没有声明事务的情况下,按照非事务方式执行,所以test2方法执行后依然能插入李四。
(2)外层方法有事务
test3 | 张三未插入,李四未插入 |
test4 | 张三未插入,李四未插入 |
test5 | 张三未插入,李四未插入 |
结论:当外层方法支持事务传播时,内层事务加入到外层事务,绑定到一起,只要其中一个发生异常,不管内层方法执行时是否捕获异常,整个事务都需要回滚,这点类似Required。