云笔记项目-Spring事务学习-传播REQUIRES_NEW
接下来测试事务传播的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的更多相关文章
- 云笔记项目-Spring事务学习-传播Requried
在准备好前期的项目搭建后,接下来就一个个的测试,首先测试事务传播的Required Service层两个实现类 Service层两个实现类,只是更换了方法事务传播的属性,其他都一样,后续测试也只修改传 ...
- 云笔记项目-Spring事务学习-传播NOT_SUPPORTED
接下来测试事务传播属性设置为NOT_SUPPORTED Service层 Service层主要设置如下,其中还插入了REQUIRED作为比较. package Service; import java ...
- 云笔记项目-Spring事务学习-传播SUPPORTS
接下来测试事务传播属性SUPPORTS Service层 Service层将方法的事务传播属性设置为SUPPORTS LayerT层代码 package LayerT; import javax.an ...
- 云笔记项目-Spring事务学习-传播NEVER
接下来测试事务传播属性NEVER Service层 Service层中设置事务传播属性都为NEVER. LayerT层代码 package LayerT; import javax.annotatio ...
- 云笔记项目-Spring事务学习-传播MANDATORY
接下来测试事务传播属性MANDATORY Service层 所有Service层实现类都设置事务传播属性为MANDATORY. LayerT层代码 package LayerT; import jav ...
- 云笔记项目-Spring事务学习-传播NESTED
接下来测试事务传播属性NESTED Service层 Service层方法事务传播属性都设置为NESTED. LayerT层代码 package LayerT; import javax.annota ...
- 云笔记项目-Spring事务学习_测试准备
在做云笔记项目的过程中,顺便简单的学习了Spring的事务概念,业务以如果添加笔记,则增加用户星星数目作为例子,引入了事务的概念.类似注册送积分之类的,云笔记项目以增加笔记就送星星来说明事务.具体在添 ...
- Spring事务的传播行为 @Transactional
Spring事务的传播行为http://blog.csdn.net/cuker919/article/details/5957209 在service类前加上@Transactional,声明这个se ...
- Spring事务的传播行为 @Transactional(转)
Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...
随机推荐
- linux Table is marked as crashed and should be repaired
linux Table is marked as crashed and should be repaired 2014-07-28 10:34 1282人阅读 评论(0) 收藏 举报 分类: da ...
- win10 solidity开发环境搭建
1. 软件安装 1) 安装nodejs 安装完成后将node.exe所在路径加入环境变量PATH中,以便在cmd命令行中直接使用node和npm命令 下面的操作在git bash下进行 2) 安装so ...
- leetcode70 爬楼梯 Python
组合数学Fibonacci 例3.4.1 (上楼梯问题)某人欲登上n级楼梯,若每次只能跨一级或两级,问他从地面上到第n级楼梯,共有多少种不同的方法? (解)设上到第n级楼梯的方法数为an.分类统计 ...
- js中的数据类型、以及浅拷贝和深拷贝
一.js中的数据类型 1.基本类型(值类型):Undefined.Boolean.String.Number.Symbol 2.引用类型:函数.数组.对象.null.new Number(10)都是对 ...
- CentOS 7 升级 Linux 内核
一.升级内核 1.更新仓库 yum -y update 2.用 ELRepo 仓库 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org ...
- org.apache.catalina.LifecycleException项目启动报错
严重: A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catalin ...
- 使用nexus3.x搭建maven私服
前言 好久之前就想搭建maven仓库了,一直拖到了现在,也就是懒得动,现在终于是要付诸行动了.网上查了不少资料,好多博客都是关于2.x的搭建,我下载的是最新版的nexus,好多教程已经不能使用,以此记 ...
- 003.[python学习] 简单抓取豆瓣网电影信息程序
声明:本程序仅用于学习爬网页数据,不可用于其它用途. 本程序仍有很多不足之处,请读者不吝赐教. 依赖:本程序依赖BeautifulSoup4和lxml,如需正确运行,请先安装.下面是代码: #!/us ...
- nginx功能扩展整理
0.基本负载均衡配置 编辑/etc/nginx/nginx.conf,加入负载平衡配置: http { upstream tomcat { server localhost:8080; server ...
- Maven 错误 :The POM for com.xxx:jar:0.0.1-SNAPSHOT is invalid, transitive dependencies (if any) will not be available
一个大的maven 项目,结构是一个根pom,下面几个小的module,包括了appservice-darc,appservice-entity等,其中appservice-darc 依赖了 apps ...