Spring中NESTED和REQUIRED_NEW传播行为的区别
简介
PROPAGATION_REQUIRED_NEW:
表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager。
PROPAGATION_NESTED:
表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务。
嵌套事务: 外事物异常,内事物回滚;内事物异常,外事物正常。
案例
PROPAGATION_REQUIRED_NEW案例
serviceOne层中方法
@Transactional(rollbackFor = Exception.class)
public void moneyTestREQUIRED_NEWOne(){
log.info("moneyTestREQUIRED_NEWOne事物名字{}", TransactionSynchronizationManager.getCurrentTransactionName());
//1.查询病人基本信息
List<TBICXX> tbicxx = basisDao.getTBICXX();
//2.根据CMZH更新TBMZFYHZ
Integer TBMZFYHZCount = tbmzfyhzDao.updateByCMZH("土登", "1903003643");
log.info("更新TBMZFYHZ影响行数{}",TBMZFYHZCount);
try {
propagationBehaviorTwo.moneyTestREQUIRED_NEWTwo();
} catch (Exception e) {
e.printStackTrace();
}
log.info("-------------事物虽然回滚了,但是逻辑继续执行------------");
}
serviceTwo层中方法
@Transactional(rollbackFor = Exception.class,propagation= Propagation.REQUIRES_NEW)
public void moneyTestREQUIRED_NEWTwo(){
log.info("moneyTestREQUIRED_NEWTwo事物名字{}", TransactionSynchronizationManager.getCurrentTransactionName());
//3.根据CMZH更新TBMZFYMXGH
Integer integer = tbmzfymxghDao.updateByCMZH("土登", "2107000224");
log.info("更新TBMZFYMXGH影响行数{}",integer);
int i=2/0;
}
Test层中方法
/**
* 测试其传播行为
* PROPAGATION_REQUIRED_NEW:
* 表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
*
**/
@Test
public void testTransationalPropagationREQUIRED_NEW(){
behaviorOne.moneyTestREQUIRED_NEWOne();
}
运行前

运行后数据库数据

运行后控制台打印

结论
外事物和内事物是独立的事物,内事物异常回滚不影响外事物,外事物回滚不影响内事物。
PROPAGATION_NESTED案例
serviceOne层中方法
@Transactional(rollbackFor = Exception.class)
public void moneyTestNESTEDOne(){
log.info("moneyTestNESTEDOne事物名字{}", TransactionSynchronizationManager.getCurrentTransactionName());
//1.查询病人基本信息
List<TBICXX> tbicxx = basisDao.getTBICXX();
//2.根据CMZH更新TBMZFYHZ
Integer TBMZFYHZCount = tbmzfyhzDao.updateByCMZH("三筒", "1903003643");
log.info("更新TBMZFYHZ影响行数{}",TBMZFYHZCount);
try {
propagationBehaviorTwo.moneyTestNESTEDTwo();
} catch (Exception e) {
// 为了避免 org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only 该异常产生
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
e.printStackTrace();
}
int i=2/0; //JJ句
log.info("-------------事物虽然回滚了,但是逻辑继续执行------------");
}
serviceTwo层中方法
@Transactional(rollbackFor = Exception.class,propagation= Propagation.NESTED)
public void moneyTestNESTEDTwo(){
log.info("moneyTestNESTEDTwo事物名字{}", TransactionSynchronizationManager.getCurrentTransactionName());
//3.根据CMZH更新TBMZFYMXGH
Integer integer = tbmzfymxghDao.updateByCMZH("三筒", "2107000224");
log.info("更新TBMZFYMXGH影响行数{}",integer);
int i=2/0; //KK句
}
运行前数据库数据

--------------KK句注释调运行结果,JJ句开启---------------
运行后数据库数据

运行后控制台打印

--------------JJ句注释调运行结果,KK句开启---------------
运行后数据库数据

运行后控制台打印

结论
嵌套事物: 运行的是同一个事物,外事物提交,内事物回滚是通过设置回滚点来实现,具体实现过程参考:
https://www.jianshu.com/p/2f79ee33c8ad
Gitee代码地址
Spring中NESTED和REQUIRED_NEW传播行为的区别的更多相关文章
- 事务特性,事务的隔离级别以及spring中定义的事务传播行为
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- Spring中@Autowired注解、@Resource注解的区别 (zz)
Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...
- Spring中Model,ModelMap以及ModelAndView之间的区别
原文链接:http://blog.csdn.net/zhangxing52077/article/details/75193948 Spring中Model,ModelMap以及ModelAndVie ...
- Spring中BeanFactory与FactoryBean到底有什么区别?
一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean().containsBean()等管理Bea ...
- Spring中的注解@Value("#{}")与@Value("${}")的区别
1 @Value("#{}") SpEL表达式 @Value("#{}") 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法.当然还有可 ...
- Spring中使用@within与@target的一些区别
目录 背景 模拟项目例子 看看使用@within和@target的区别 @within @target @target 看起来跟合理一点 通知方法中注解参数的值为什么是不一样的 想用@within,但 ...
- Spring中@Autowired注解、@Resource注解的区别
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...
- 转:Spring中@Autowired注解、@Resource注解的区别
Pay attention: When using these annotations, the object itself has to be created by Spring context. ...
- Spring中 @Autowired注解与@Resource注解的区别
Spring中 @Autowired注解与@Resource注解的区别在Spring 3.X中经常使用到@Autowired和@Resource进行装配.这两个注解的差异在何处???相同点:@Reso ...
随机推荐
- 第四十二个知识点:看看你的C代码为蒙哥马利乘法,你能确定它可能在哪里泄漏侧信道路吗?
第四十二个知识点:看看你的C代码为蒙哥马利乘法,你能确定它可能在哪里泄漏侧信道路吗? 几个月前(回到3月份),您可能还记得我在这个系列的52件东西中发布了第23件(可以在这里找到).这篇文章的标题是& ...
- Not All Samples Are Created Equal: Deep Learning with Importance Sampling
目录 概 主要内容 "代码" Katharopoulos A, Fleuret F. Not All Samples Are Created Equal: Deep Learnin ...
- 以简御繁介绍IOC
1.IOC的理论背景 大家开发理念,一直都是奔着架构稳定.低耦合性.而IOC初衷,就是为了解决模块依赖问题,理解<六大设计原则(SOLID)> 如图所示,在我们开发中,业务的实现,就是靠着 ...
- linux系统安装java
1.下载Java压缩包 *.gz 2.解压 3.修改Linux配置文件,配置Java环境变量 4.使用命令source /etc/profile让修改生效 转载 https://www.cnblogs ...
- Java面向对象笔记 • 【第6章 Java常用类】
全部章节 >>>> 本章目录 6.1 Object类 6.1.1 Object类概述 6.1.2 Object的常用方法 6.1.3 实践练习 6.2 String类和St ...
- 图解四种 IO 模型
最近越来越认为,在讲解技术相关问题时,大白话固然很重要,通俗易懂,让人有想读下去的欲望.但几乎所有的事,都有两面性,在看到其带来好处时,不妨想想是否也引入了不好的地方. 例如在博客中,过于大白话的语言 ...
- java字符串比较是否都可直接使用==?
java字符串比较,两个字符串相不相等,直接用==来判断可以吗?或者判断两个字符串不相等,直接用!=? 不能 两个对象进行比较,如果使用==符号,那么比较的是这两个对象的"引用"( ...
- JS 在使用hasOwnProperty()函数时报错
在使用hasOwnProperty()方法判断对象是否具有某种属性时eslint报下列错误: Do not access Object.prototype method 'hasOwnProperty ...
- minio实现文件上传下载和删除功能
https://blog.csdn.net/tc979907461/article/details/106673570?utm_medium=distribute.pc_relevant_t0.non ...
- Go语言系列之网络编程
现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其实是一个很庞大的领域,本 ...