简介

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代码地址

https://gitee.com/zhuayng/foundation-study/tree/develop/SpringBootDemo/src/main/java/com/yxkj/springbootdemo/service/impl

Spring中NESTED和REQUIRED_NEW传播行为的区别的更多相关文章

  1. 事务特性,事务的隔离级别以及spring中定义的事务传播行为

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  2. Spring中@Autowired注解、@Resource注解的区别 (zz)

    Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...

  3. Spring中Model,ModelMap以及ModelAndView之间的区别

    原文链接:http://blog.csdn.net/zhangxing52077/article/details/75193948 Spring中Model,ModelMap以及ModelAndVie ...

  4. Spring中BeanFactory与FactoryBean到底有什么区别?

    一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean().containsBean()等管理Bea ...

  5. Spring中的注解@Value("#{}")与@Value("${}")的区别

    1 @Value("#{}") SpEL表达式 @Value("#{}") 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法.当然还有可 ...

  6. Spring中使用@within与@target的一些区别

    目录 背景 模拟项目例子 看看使用@within和@target的区别 @within @target @target 看起来跟合理一点 通知方法中注解参数的值为什么是不一样的 想用@within,但 ...

  7. Spring中@Autowired注解、@Resource注解的区别

    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...

  8. 转:Spring中@Autowired注解、@Resource注解的区别

    Pay attention: When using these annotations, the object itself has to be created by Spring context. ...

  9. Spring中 @Autowired注解与@Resource注解的区别

    Spring中 @Autowired注解与@Resource注解的区别在Spring 3.X中经常使用到@Autowired和@Resource进行装配.这两个注解的差异在何处???相同点:@Reso ...

随机推荐

  1. @Transactional 注解实现

    @Transactional注解简介 @Transactional是spring中声明式事务管理的注解配置方式,相信这个注解的作用大家都很清楚.@Transactional注解可以帮助我们把事务开启. ...

  2. Limitations of the Lipschitz constant as a defense against adversarial examples

    目录 概 主要内容 Huster T., Chiang C. J. and Chadha R. Limitations of the lipschitz constant as a defense a ...

  3. OverFeat:Integrated Recognition, Localization and Detection using Convolutional Networks

    目录 概 主要内容 Sermanet P., Eigen D., Zhang X., Mathieu M., Fergus R., LeCun Y. OverFeat:integrated recog ...

  4. 后缀数组【原理+python代码】

    后缀数组 参考:https://blog.csdn.net/a1035719430/article/details/80217267 https://blog.csdn.net/YxuanwKeith ...

  5. <数据结构>XDOJ323.判断有向图中是否有环

    问题与解答 问题描述 判断有向图中是否有环. 输入格式 输入数据第一行是一个正整数,表示n个有向图,其余数据分成n组,每组第一个为一个整数,表示图中的顶点个数n,顶点数不超过100,之后为有向图的邻接 ...

  6. Tomcat 服务器的端口会与其他的服务器端口发生冲突,此时则需要修改 Tomcat 服务器的端口

    查看相关知识 查看相关练习 Tomcat 服务器的端口会与其他的服务器端口发生冲突,此时则需要修改 Tomcat 服务器的端口 实现步骤: 1.找到 Tomcat 服务器安装目录下的 conf 文件夹 ...

  7. 利用自定义动画 animate() 方法,实现某图书网站中“近 7 日畅销榜”中的图书无缝垂直向上滚动特效:当光标移入到图书上时,停止滚动,鼠标移开时,继续滚动

    查看本章节 查看作业目录 需求说明: 利用自定义动画 animate() 方法,实现某图书网站中"近 7 日畅销榜"中的图书无缝垂直向上滚动特效:当光标移入到图书上时,停止滚动,鼠 ...

  8. 【MySQL作业】SELECT 数据查询——美和易思模糊查询应用习题

    点击打开所使用到的数据库>>> 1.根据商品名关键字查找商品信息. 查询带"美"字的商品信息: SELECT * FROM goods WHERE goodsNa ...

  9. Windows下安装配置jdk

    1.jdk安装 从官网获取jdk安装包后, 双击图形化安装,一路next即可. 2.配置JavaHome 打开计算机->系统属性->高级系统设置->环境变量 在系统变量下面添JAVA ...

  10. [学习笔记] IT项目管理 - 关键路径法

    关键路径法 只有项目网络中最常的或者耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径.组成关键路径的活动称为关键活动. 图形表示 最早开始时间ES 工期Duration 最早结束时 ...