一、事务的传播行为
1.介绍

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
2.属性

事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。

系统默认的是REQUIRED属性。
常用的是REQUIRED和REQUIRES_NEW,所以此处只说明这两种属性。
下面先看系统默认的REQUIRED属性。


purchase代表两个声明了事务的方法,并且传播行为是系统的默认行为。同时checkout也是一个声明了事务的方法,在该方法中调用前述的两个方法。当checkout执行到第一个方法的时候,第一个方法继续使用checkout的事务进行执行,第二个方法一样,所以整个方法只有一个事务。

下面介绍REQUIRES_NEW属性。

方法含义和上述一样,知识两个子方法的传播属性均为REQUIRES_NEW。主方法的事务tx1执行到第一个方法的时候,挂起,然后子方法的事务进行,第二个方法类似。

如果一个事务发生了错误,那么回滚。所以REQUIRED属性中,如果第二个方法发生错误,第一个方法也会回滚,然而REQUIRES_NEW属性中,第二个方法发生错误,因为第一个是单独的事务,所以不会受到影响。

那么,如果两个混合使用呢?
(为简单起见,REQUIRED在下述表达称为系统默认,REQUIRES_NEW称为new)
现在测试第一种方法的属性为系统默认,第二种方法为new,第二种方法出现错误。此时结果是方法1也回滚。但是按照前面的理解,方法2是单独的事务,应该只造成自己回滚,为什么第一种方法也会回滚?

第一种方法发生错误后,产生错误造成本身回滚,但是他的异常因为没有捕获,所以传到了主方法的事务中,主方法的事务出现错误,所以回滚,第一个方法在主方法的事务中,所以第一个方法的SQL语句会回滚!
下面用一个简图总结一下:


如果第一种方法为new,第二种方法为系统默认,那么第二种发生错误后,主方法的事务回滚,然后第一种方法是自己的事务,所以不受影响,不回回滚,第一个方法的SQL语句就会执行。道理雷同,就不再画图表示。

Spring中声明式事务的注解@Transactional的参数的总结(REQUIRED和REQUIRES_NEW的与主方法的回滚问题)的更多相关文章

  1. Spring的声明式事务----Annotation注解方式(2)

    使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/b ...

  2. Spring中声明式事务存在的优缺点以及注意事项!

    事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种. 关于事务的基础知识,如什么是事务,数据库事务以及Spring事务的ACID.隔离级别. ...

  3. Spring的声明式事务----Annotation注解方式(1)

    这里列一个小的demo工程,直接利用Spring的jdbcTemplate访问Mysql数据库. 工程结构: 数据库中的tbl_student表结构如下: 数据实体类Student.java代码如下: ...

  4. Spring中声明式事务的几个属性的解释

    声明式事务 @Transactional (通常用在service层)事务属性:传播行为,隔离级别,回滚,只读,过期 1,spring支持事务传播行为:propagation(常用以下两个)    ① ...

  5. 保护亿万数据安全,Spring有“声明式事务”绝招

    摘要:点外卖时,你只需考虑如何拼单:选择出行时,你只用想好目的地:手机支付时,你只需要保证余额充足.但你不知道这些智能的背后,是数以亿计的强大数据的支持,这就是数据库的力量.那么庞大数据的背后一定会牵 ...

  6. @Transactional、Spring的声明式事务

    传送门 一.Spring的声明式事务 需要在xml文件中配置 <!--配置事务管理器类--> <bean id="transactionManager" clas ...

  7. 使用注解实现Spring的声明式事务管理

    使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制 ...

  8. Spring之声明式事务

    在讲声明式事务之前,先回顾一下基本的编程式事务 编程式事务: //1.获取Connection对象 Connection conn = JDBCUtils.getConnection(); try { ...

  9. 【Spring】——声明式事务配置详解

    项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...

随机推荐

  1. linux 查看文件内容的几种命令

    cat #将文件内容输出到屏幕head #查看文件开头N行tail #查看文件末尾N行tailf #动态的查看的写入,有写入时屏幕输出vim.vi #文件编辑器,也可以当是查看文件{进入文件}grep ...

  2. 【CSP模拟赛】凤凰院凶真(最长公共上升子序列)

    题目描述 α世界线.凤凰院凶真创立了反抗SERN统治的组织“瓦尔基里”.为了脱离α线,他需要制作一个世界线变动率测量仪. 测量一个世界线相对于另一个世界线的变动率,实质上就是要求出这两个世界线的最长公 ...

  3. docker运行puppeteer出现defucnt僵尸进程

    其实这是docker的一个bug,就是在运行前加--init即可,注意这个在mac中没有只在linux上有. docker run --init -d ..... 具体内容参见:https://sta ...

  4. Spring Boot AOP 简易操作日志管理

    AOP (Aspect Oriented Programming) 面向切面编程. 业务有核心业务和边缘业务. 比如用户管理,菜单管理,权限管理,这些都属于核心业务. 比如日志管理,操作记录管理,这些 ...

  5. h2的时间类型和函数

    H2时间类型: (时间)TIME: 格式为 hh:mm:ss.对应到Java类型:java.sql.Time. (日期)DATE: 格式为 yyyy-MM-dd.对应到Java类型: java.sql ...

  6. ffmpeg编译错误,提示找不到相应的shared libraries :libavdevice.so.53

    解决方法:需要配置响应的环境变量,以便能找到响应的lib库 vi   /etc/ld.so.conf 加入   /usr/local/lib 执行  sudo  ldconfig

  7. [转载]IBM公司发布了最新的power7服务器p750 p770 p780

    [转载]IBM公司发布了最新的power7服务器p750 p770 p780 (2015-06-11 12:54:17) 转载▼ http://blog.sina.com.cn/s/blog_6f52 ...

  8. Sword cjson库函数使用

    /* cjson库的使用 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #includ ...

  9. netty5心跳与阻塞性业务消息分发实例

    继续之前的例子(netty5心跳与业务消息分发实例),我们在NettyClientHandler把业务消息改为阻塞性的: package com.wlf.netty.nettyclient.handl ...

  10. oracle数据库【表复制】insert into select from跟create table as select * from 两种表复制语句区别

    create table  as select * from和insert into select from两种表复制语句区别 create table targer_table as select ...