接下来测试事务传播的REQUIRES_NEW。

Service层

Service层代码在这里不展示了,主要将EMPService1Impl类中的方法事务传播属性设置为REQUIRED,EMPService2Impl类中的方法事务传播属性为REQUIRES_NEW,下面代码进行了注释说明。

LayerT层代码

 package LayerT;

 import javax.annotation.Resource;

 import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import Entity.EMP;
import Service.EMPService1;
import Service.EMPService2;
/**
* 测试Requires_New
* @author yangchaolin
*
*/
@Component("requiredNewTest")
public class RequiredNewTest {
@Resource(name="service1")
EMPService1 service1;
@Resource(name="service2")
EMPService2 service2;
/**
* 外层方法没有事务,但是抛出异常,内层方法一个事务为Required,一个为Requires_New,以下注释了
* @param emp1
* @param emp2
*/
public void testRequiredNewWithoutTransaction1(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);//事务传播为Required
service2.addEmp2(emp2);//事务传播为Requires_New
throw new RuntimeException();
}
/**
* 外层方法没有事务,但是内层方法抛出异常
* @param emp1
* @param emp2
*/
public void testRequiredNewWithoutTransaction2(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);//事务传播为Required
service2.addEmp2WithException(emp2);//事务传播为Requires_New
}
/**
* 外层方法有事务,并且抛出异常
* @param emp1
* @param emp2
*/
@Transactional(propagation=Propagation.REQUIRED)
public void testRequiredNewWithTransaction1(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);//事务传播为Required
service2.addEmp2(emp2);//事务传播为Requires_New
throw new RuntimeException();
}
/**
* 外层方法有事务,由内层方法抛出异常
* @param emp1
* @param emp2
* @param emp3
*/
@Transactional(propagation=Propagation.REQUIRED)
public void testRequiredNewWithTransaction2(EMP emp1,EMP emp2,EMP emp3) {
service1.addEmp1(emp1);//事务传播为Required
service2.addEmp2(emp2);//事务传播为Requires_New
service2.addEmp2WithException(emp3);//事务传播为Requires_New
}
/**
* 外层方法有事务,内层方法抛出的异常被捕获
* @param emp1
* @param emp2
* @param emp3
*/
@Transactional(propagation=Propagation.REQUIRED)
public void testRequiredNewWithTransaction3(EMP emp1,EMP emp2,EMP emp3) {
service1.addEmp1(emp1);//事务传播为Required
service2.addEmp2(emp2);//事务传播为Requires_New
try {
service2.addEmp2WithException(emp3);//事务传播为Requires_New
}catch(Exception e) {
System.out.println("回滚");
}
}
}

测试代码

 package TestCase;

 import org.junit.Test;

 import Entity.EMP;
import LayerT.RequiredNewTest; public class requireNewTestCase extends baseTest{
@Test
public void test1() {
RequiredNewTest T1=ac.getBean("requiredNewTest",RequiredNewTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testRequiredNewWithoutTransaction1(emp1, emp2);
}
@Test
public void test2() {
RequiredNewTest T1=ac.getBean("requiredNewTest",RequiredNewTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testRequiredNewWithoutTransaction2(emp1, emp2);
}
@Test
public void test3() {
RequiredNewTest T1=ac.getBean("requiredNewTest",RequiredNewTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testRequiredNewWithTransaction1(emp1, emp2);
}
@Test
public void test4() {
RequiredNewTest T1=ac.getBean("requiredNewTest",RequiredNewTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
EMP emp3=new EMP("王五",22);
T1.testRequiredNewWithTransaction2(emp1, emp2, emp3);
}
@Test
public void test5() {
RequiredNewTest T1=ac.getBean("requiredNewTest",RequiredNewTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
EMP emp3=new EMP("王五",22);
T1.testRequiredNewWithTransaction3(emp1, emp2, emp3);
}
}

测试结果

(1)外层方法没有事务

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

结论:外层方法如果没有事务,内层方法事务相互独立,在事务传播为REQUIRED_NEW的情况下,内层方法如果抛出异常将不会插入数据,数据回滚,但不会影响其他内层方法。

(2)外层方法有事务

test3 张三未插入,李四插入
test4 张三未插入,李四插入,王五未插入
test5 张三插入,李四插入,王五未插入

结论:如果外层事务传播属性为默认的REQUIRED,内层方法如果有同样的事务传播属性,将绑定在一起,只要外层方法抛出异常,或者感知内层方法抛出的异常,都会回滚。而内层方法事务传播属性为REQUIRES_NEW时,会单独开辟一个自己的事务,不受外层事务的干扰。

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

云笔记项目-Spring事务学习-传播REQUIRES_NEW的更多相关文章

  1. 云笔记项目-Spring事务学习-传播Requried

    在准备好前期的项目搭建后,接下来就一个个的测试,首先测试事务传播的Required Service层两个实现类 Service层两个实现类,只是更换了方法事务传播的属性,其他都一样,后续测试也只修改传 ...

  2. 云笔记项目-Spring事务学习-传播NOT_SUPPORTED

    接下来测试事务传播属性设置为NOT_SUPPORTED Service层 Service层主要设置如下,其中还插入了REQUIRED作为比较. package Service; import java ...

  3. 云笔记项目-Spring事务学习-传播SUPPORTS

    接下来测试事务传播属性SUPPORTS Service层 Service层将方法的事务传播属性设置为SUPPORTS LayerT层代码 package LayerT; import javax.an ...

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

    接下来测试事务传播属性NEVER Service层 Service层中设置事务传播属性都为NEVER. LayerT层代码 package LayerT; import javax.annotatio ...

  5. 云笔记项目-Spring事务学习-传播MANDATORY

    接下来测试事务传播属性MANDATORY Service层 所有Service层实现类都设置事务传播属性为MANDATORY. LayerT层代码 package LayerT; import jav ...

  6. 云笔记项目-Spring事务学习-传播NESTED

    接下来测试事务传播属性NESTED Service层 Service层方法事务传播属性都设置为NESTED. LayerT层代码 package LayerT; import javax.annota ...

  7. 云笔记项目-Spring事务学习_测试准备

    在做云笔记项目的过程中,顺便简单的学习了Spring的事务概念,业务以如果添加笔记,则增加用户星星数目作为例子,引入了事务的概念.类似注册送积分之类的,云笔记项目以增加笔记就送星星来说明事务.具体在添 ...

  8. Spring事务的传播行为 @Transactional

    Spring事务的传播行为http://blog.csdn.net/cuker919/article/details/5957209 在service类前加上@Transactional,声明这个se ...

  9. Spring事务的传播行为 @Transactional(转)

    Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...

随机推荐

  1. vs2017 F5不会自动编译了

    其实我的错误提示是:c# 不会命中断点 源代码与原始版本不同 我在网上搜索这个,发现让另存啦.格式化代码啦.批量重生成啦. 只有批量重生成好用,断点能打上,其他方法都不行. 可是每次都批量重生成太麻烦 ...

  2. AngularJS 1.x 思维索引

    我们在这里不讨论Angular2和Angular4,因为其完全重写,其实已经不叫AngularJS了. AngularJS的缺陷: 性能问题:通过检查脏值进行数据更新,当数据不断增加时,检查的效率就不 ...

  3. 升级GCC以支持C++11

    本文主要介绍在Linux系统下,如何升级GCC以支持C++11.目前来看GCC是对C++11支持程度最高最多的编译器,但需要GCC4.8及以上版本.  本文使用操作系统:Centos 6.4 Desk ...

  4. 未来-IOT-Aliyun:ICA 联盟

    ylbtech-未来-IOT-Aliyun:ICA 联盟 ICA联盟介绍 为解决IoT标准体系不完善,场景复合或者分散,不同领域端云连接.通信组网.数据属性.端到端安全.测试标准缺乏或不统一等痛点问题 ...

  5. AES和RSA的加密过程通过面向对象的方式写成一个类,封装起来

    # 面向对象的方式 实现加密方法 from Crypto.Cipher import AES from Crypto import Random from binascii import b2a_he ...

  6. note 9 列表、时间复杂度、排序

    列表 List +内建(built-in)数据结构(data structure),用来存储一系列元素(items) 如:lst = [5.4,'hello',2] 前向索引.后向索引.切片.拼接.成 ...

  7. 记录1-更换mac pro内存,硬盘及恢复系统

    我的mac pro是2012年初买的,4G/500G HDD在服役了六年多后速度堪比老牛,以前装的虚拟机压根不敢打开.这几天把内存更换为8G,硬盘升级为samsung的1T SSD,感觉像起死回生一样 ...

  8. 使用shell解析脚本依赖关系,并自动补数

    将脚本依赖关系放到表中 使用shell解析脚本依赖关系,递归的计算各个脚本. #!/bin/bash # dm 补数 basepath=$(cd ``; pwd) cd $basepath sourc ...

  9. JDK最新版 Jmeter最新版

    http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html http://jmeter.a ...

  10. C语言解决约瑟夫问题详解的代码

    将开发过程中比较重要的一些内容做个收藏,下面的内容是关于C语言解决约瑟夫问题详解的内容,希望能对码农有帮助. #pragma once #include<vector> class PRO ...