云笔记项目-Spring事务学习-传播NESTED
接下来测试事务传播属性NESTED
Service层
Service层方法事务传播属性都设置为NESTED。
LayerT层代码
package LayerT; import javax.annotation.Resource; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import Entity.EMP;
import Service.EMPService1;
import Service.EMPService2;
/**
* 测试Nested
* @author yangchaolin
*
*/
@Component("nestedTest")
public class NestedTest {
@Resource(name="service1")
EMPService1 service1;
@Resource(name="service2")
EMPService2 service2;
/**
* 外层方法没有事务,但是抛出异常
* @param emp1
* @param emp2
*/
public void testNestedWithoutTransaction1(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);
service2.addEmp2(emp2);
throw new RuntimeException();
}
/**
* 外层方法没有事务,内层方法抛出异常
* @param emp1
* @param emp2
*/
public void testNestedWithoutTransaction2(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);
service2.addEmp2WithException(emp2);
}
/**
* 外层方法有事务,并且抛出异常
* @param emp1
* @param emp2
*/
@Transactional //默认为传播属性为Required
public void testNestedWithTransaction1(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);
service2.addEmp2(emp2);
throw new RuntimeException();
}
/**
* 外层方法有事务,内层方法抛出异常
* @param emp1
* @param emp2
*/
@Transactional //默认为传播属性为Required
public void testNestedWithTransaction2(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);
service2.addEmp2WithException(emp2);
}
/**
* 外层方法有事务,内层方法抛出的异常被捕获
* @param emp1
* @param emp2
*/
@Transactional //默认为传播属性为Required
public void testNestedWithTransaction3(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);
try {
service2.addEmp2WithException(emp2);
}catch(Exception e) {
System.out.println("回滚");
}
}
}
测试代码
package TestCase; import org.junit.Test; import Entity.EMP;
import LayerT.NestedTest;
import LayerT.RequiredTest; public class nestedTestCase extends baseTest{
@Test
public void test1() {
NestedTest T1=ac.getBean("nestedTest",NestedTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testNestedWithoutTransaction1(emp1, emp2);
}
@Test
public void test2() {
NestedTest T1=ac.getBean("nestedTest",NestedTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testNestedWithoutTransaction2(emp1, emp2);
}
@Test
public void test3() {
NestedTest T1=ac.getBean("nestedTest",NestedTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testNestedWithTransaction1(emp1, emp2);
}
@Test
public void test4() {
NestedTest T1=ac.getBean("nestedTest",NestedTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testNestedWithTransaction2(emp1, emp2);
}
@Test
public void test5() {
NestedTest T1=ac.getBean("nestedTest",NestedTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testNestedWithTransaction3(emp1, emp2);
}
}
测试结果:
(1)外层方法没有事务
| test1 | 张三插入,李四插入 |
| test2 | 张三插入,李四未插入 |
结论:在外层方法没有事务声明的情况下,内层方法事务传播属性为NESTED时,类似REQUIRED,内层方法之间事务相互独立,互不影响,如果内层方法有异常,会单独回滚自己的事务,不会影响其他事务。
(2)外层方法有事务
| test3 | 张三未插入,李四未插入 |
| test4 | 张三未插入,李四未插入 |
| test5 | 张三插入,李四未插入 |
结论:当外层方法声明默认事务,其传播属性为REQUIRED,内层方法事务传播属性为NESTED的情况下,内层方法事务为外层方法事务的子事务,当外层方法有异常,或者内层方法抛出异常,所以事务都需要回滚,所以test3和test4都没有插入成功。当内层方法抛出异常被捕获,只会回滚当前抛出异常的方法事务,其他子事务不受影响。
参考博文:https://segmentfault.com/a/1190000013341344
云笔记项目-Spring事务学习-传播NESTED的更多相关文章
- 云笔记项目-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事务学习-传播REQUIRES_NEW
接下来测试事务传播的REQUIRES_NEW. Service层 Service层代码在这里不展示了,主要将EMPService1Impl类中的方法事务传播属性设置为REQUIRED,EMPServi ...
- 云笔记项目-Spring事务学习_测试准备
在做云笔记项目的过程中,顺便简单的学习了Spring的事务概念,业务以如果添加笔记,则增加用户星星数目作为例子,引入了事务的概念.类似注册送积分之类的,云笔记项目以增加笔记就送星星来说明事务.具体在添 ...
- Spring事务的传播行为 @Transactional
Spring事务的传播行为http://blog.csdn.net/cuker919/article/details/5957209 在service类前加上@Transactional,声明这个se ...
- Spring事务的传播行为 @Transactional(转)
Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...
随机推荐
- 【C++】const & 指针
https://blog.csdn.net/qq_21808961/article/details/78401950
- rocketMQ(二 )Centos7 集群
rocketMQ集群: 在运用中流程一般 是在程序中使用代码编辑生产者,将所需要的消息发送到rocketmq中,然后另一个程序编辑消费者从rocketmq里面获取消息.rocketmq集群 需要对na ...
- 配置RIPng(PT)
一:拓扑图 二:配置过程 1:首先为pc0:pc1: pc2 配置IPv6地址(注意标明前缀),可以手动配置也可以自动获取. 手动配置 自动获取 2:给路由器配置RIPng协议 全局开启RIPng协议 ...
- CNVD-C-2019-48814 漏洞
CNVD-C-2019-48814 WebLogic wls9-async反序列化远程命令执行漏洞 网上均有详细的说明(https://github.com/jas502n/CNVD-C-2019-4 ...
- SOCKET选项
1. IP_TRANSPARENT [1]socket设置该选项后,可以处理发往非本机的数据包. [2]使用流程: 配置防火墙和路由: iptables -t mangle -A PREROUTING ...
- Halcon Visinpro 破解版
目前测试过的破解版资料: halcon10 可用已测 完美破解 halcon12 可用已测 完美破解 halcon13 可用已测 完美破解 halcon17 可用已测 ...
- javascript websocket 心跳检测机制介绍
====测试代码: ==index.html <!DOCTYPE html> <html lang="en"> <head> <meta ...
- js长整型的失真问题解决
遇到的问题: 后端返回的订单号是整型的,超过了Math.pow(2,53) = 9007199254740992,导致获取的数据失真. 类似问题:https://www.zhihu.com/quest ...
- 29.python环境搭建
新的笔记本上搭建的python运行环境:1.首先现在下载python版本,我这里拿的是之前用的3.5老版本 2.双击安装(勾选 add Python3.5 to path) 3.检测是否安装成功 4. ...
- jQuery入门基础(选择器)
一.jQuery简介 jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. jQuery 库位于一个 JavaScript 文件中,其中包含了所有 ...