接下来测试事务传播属性设置为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的方法,不论内层还是外层方法有异常,都不开启事务,出错也提交事务。