Spring中声明式事务的注解@Transactional的参数的总结(REQUIRED和REQUIRES_NEW的与主方法的回滚问题)
一、事务的传播行为
1.介绍
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
2.属性
事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。
系统默认的是REQUIRED属性。
常用的是REQUIRED和REQUIRES_NEW,所以此处只说明这两种属性。
下面先看系统默认的REQUIRED属性。
purchase代表两个声明了事务的方法,并且传播行为是系统的默认行为。同时checkout也是一个声明了事务的方法,在该方法中调用前述的两个方法。当checkout执行到第一个方法的时候,第一个方法继续使用checkout的事务进行执行,第二个方法一样,所以整个方法只有一个事务。
下面介绍REQUIRES_NEW属性。
如果一个事务发生了错误,那么回滚。所以REQUIRED属性中,如果第二个方法发生错误,第一个方法也会回滚,然而REQUIRES_NEW属性中,第二个方法发生错误,因为第一个是单独的事务,所以不会受到影响。
那么,如果两个混合使用呢?
(为简单起见,REQUIRED在下述表达称为系统默认,REQUIRES_NEW称为new)
现在测试第一种方法的属性为系统默认,第二种方法为new,第二种方法出现错误。此时结果是方法1也回滚。但是按照前面的理解,方法2是单独的事务,应该只造成自己回滚,为什么第一种方法也会回滚?
第一种方法发生错误后,产生错误造成本身回滚,但是他的异常因为没有捕获,所以传到了主方法的事务中,主方法的事务出现错误,所以回滚,第一个方法在主方法的事务中,所以第一个方法的SQL语句会回滚!
下面用一个简图总结一下:
如果第一种方法为new,第二种方法为系统默认,那么第二种发生错误后,主方法的事务回滚,然后第一种方法是自己的事务,所以不受影响,不回回滚,第一个方法的SQL语句就会执行。道理雷同,就不再画图表示。
Spring中声明式事务的注解@Transactional的参数的总结(REQUIRED和REQUIRES_NEW的与主方法的回滚问题)的更多相关文章
- Spring的声明式事务----Annotation注解方式(2)
使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/b ...
- Spring中声明式事务存在的优缺点以及注意事项!
事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种. 关于事务的基础知识,如什么是事务,数据库事务以及Spring事务的ACID.隔离级别. ...
- Spring的声明式事务----Annotation注解方式(1)
这里列一个小的demo工程,直接利用Spring的jdbcTemplate访问Mysql数据库. 工程结构: 数据库中的tbl_student表结构如下: 数据实体类Student.java代码如下: ...
- Spring中声明式事务的几个属性的解释
声明式事务 @Transactional (通常用在service层)事务属性:传播行为,隔离级别,回滚,只读,过期 1,spring支持事务传播行为:propagation(常用以下两个) ① ...
- 保护亿万数据安全,Spring有“声明式事务”绝招
摘要:点外卖时,你只需考虑如何拼单:选择出行时,你只用想好目的地:手机支付时,你只需要保证余额充足.但你不知道这些智能的背后,是数以亿计的强大数据的支持,这就是数据库的力量.那么庞大数据的背后一定会牵 ...
- @Transactional、Spring的声明式事务
传送门 一.Spring的声明式事务 需要在xml文件中配置 <!--配置事务管理器类--> <bean id="transactionManager" clas ...
- 使用注解实现Spring的声明式事务管理
使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制 ...
- Spring之声明式事务
在讲声明式事务之前,先回顾一下基本的编程式事务 编程式事务: //1.获取Connection对象 Connection conn = JDBCUtils.getConnection(); try { ...
- 【Spring】——声明式事务配置详解
项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...
随机推荐
- C语言实现多线程排序
#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <string.h& ...
- MySQL数据库设置表名区分大小写
使用Mysql的朋友有时候会遇到表名称不区分大小写的情况,导致导入数据或者备份数据库很麻烦. 如何设置Mysql数据库表名区分大小写呢,配置如下: 一.修改Mysql的配置文件my.ini my.in ...
- 2019年领航杯 江苏省网络信息安全竞赛 初赛部分writeup
赛题已上传,下载连接:https://github.com/raddyfiy/2019linghangcup 做出了全部的misc和前三道逆向题,排名第10,暂且贴一下writeup. 关卡一 编码解 ...
- 使用清华源 tensorflow 安装
1. 超级权限打开cmd.exe 2. pip install --upgrade setuptools 3. pip install -U --ignore-installed wrapt enu ...
- Quartz Configuration Reference
Quartz Configuration Reference Choose a topic: Main Configuration (configuration of primary schedule ...
- Acunetix Web Vulnerability Scanner abbr. AWVS
awvs 中文手册详细版 - 木讷 - 博客园https://www.cnblogs.com/iamver/p/7124718.html Download Acunetix Trialhttps:// ...
- Typora 精美而强大的Markdown编辑器
Typora 精美而强大的Markdown编辑器 转 https://www.jianshu.com/p/45e284645d30 Markdown编辑器千千万,可是有颜值.功能强并且免费的,就没有 ...
- 解决 service iptables save 报错 please try to use systemctl
本文档根据 service iptables save 报错 please try to use systemctl 提供解决方案.报错 [root@Jaking ~]# service iptabl ...
- MyBatis原理总结(前期准备)
1.不同框架解决不用问题,框架封装了很多细节,开发者可以使用简单的方式实现功能. 2.三层架构: 1.表现层 2.业务层 3.持久层 都有相应的处理框架. 3.持久层的技术解决方案: JDBC技 ...
- Spring cloud微服务安全实战-3-3 API安全机制之流控
首先要保证你的服务是可用的,其中一个重要的手段就是流控.就是流量控制.比如我的系统每秒只能处理500个请求,那么多余的请求就拒绝掉.这样我的系统不会被压死 实际的开发中,所要面对的流控场景实际是非常复 ...