Spring遇到嵌套事务时,怎么实现

实验时却遇到一个奇怪的问题:

1、当ServiceA.a()方法调用ServiceB.b()方法时,内层事务提交和回滚,都不受外层事务提交或回滚的影响。

2、当ServiceA.a()方法调用ServiceA.c()方法时,内层事务不能正确地提交或回滚。

如下:

xxxServiceA类中,有如下两个方法。

@Transactional
method_One() {
method_Two();
} @Transactional(propagation = Propagation.REQUIRES_NEW)
method_Two(){
//do something
}

没有找到类似creating new transaction的输出,同一个Service类中,spring并不重新创建新事务,如果是两不同的Service,就会创建新事务了。

xxxServiceA类:

@Transactional
method_One() {
method_Two();
}

xxxServiceB类:

@Transactional(propagation = Propagation.REQUIRES_NEW)
method_Two(){
//do something
}

Propagation.REQUIRES_NEW生效创建了一个新事务

让事务起作用,遇到错误进行回滚,应该注意的事项:

第一种情况:同一个类中 一个方法无嵌套方法

如果方法名上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException()。否则事务不起作用。

第二种情况:同一个类中 方法A嵌套方法B
方法A有@Transactional,方法内都没有try catch,事务起作用。
方法A有@Transactional和try catch,并且catch中用throw new RuntimeException(),事务起作用。

第三种情况:不同类中,方法C嵌套方法B
方法B上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException()。否则方法B的事务不起作用。
方法C上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException(),此时方法B怎么写都行。否则方法C的事务不起作用。

文章转载至:https://blog.csdn.net/m0_37701381/article/details/85066711

Spring:Spring嵌套事务方式的更多相关文章

  1. spring框架学习(六)AOP事务及spring管理事务方式之Template模板

    概念 1.事务 1)事务特性:ACID 原子性 :强调事务的不可分割. 一致性 :事务的执行的前后数据的完整性保持一致. 隔离性 :一个事务执行的过程中,不应该受到其他事务的干扰. 持久性 :事务一旦 ...

  2. spring有三种启动方式

    spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn spring3.0及以后版本中已经删除Co ...

  3. Spring 依赖注入方式详解

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  4. Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式

    转自:http://chinazhaokeke.blog.163.com/blog/static/109409055201092811354236  Spring获取ApplicationContex ...

  5. mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类

    相信大家在刚开始学习mybatis注解方式,或者spring+mybatis注解方式的时候,一定会有一个疑问,为什么mybatis的dao接口只需要一个接口,不需要实现类,就可以正常使用,笔者最开始的 ...

  6. 程序配置的原则和实践以及 Spring Boot 支持方式

    原则 软件需要在不同的环境中部署,代码是保持不变的,但是不同的运行环境存在差异,所以需要使用配置适应不同的环境.比如: 数据库,Redis,以及其他 后端服务 的配置: 第三方服务的证书,如 oAut ...

  7. Spring 依赖注入方式详解(四)

    IoC 简介 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想 ...

  8. Spring AOP配置方式

    AOP 面向切面编程,允许在 java 应用中的方法调用的前后做一些处理. 本文通过实例介绍两种主要的Spring AOP 配置方式:xml 方式配置,注解方式配置 XML 方式配置 1. 项目包类结 ...

  9. 【spring mvc】spring mvc POST方式接收单个字符串参数,不加注解,接收到的值为null,加上@RequestBody,接收到{"uid":"品牌分类大”},加上@RequestParam报错 ---- GET方式接收单个参数的方法

    spring mvc POST方式 接收单个参数,不加任何注解,参数名对应,接收到的值为null spring mvc POST方式 接收单个参数,加上@RequestBody,接收到参数格式:{&q ...

随机推荐

  1. zabbix监控之自定义监控

    自定义监控node1数据库状态,并设置报警 编辑agent客户端的userparameter_mysql.conf 文件,最后一行添加自定义监控内容 [root@node1 ~]# cd /etc/z ...

  2. 分布式存储ceph---部署ceph(2)

    一.部署准备 准备5台机器(linux系统为centos7.6版本),当然也可以至少3台机器并充当部署节点和客户端,可以与ceph节点共用: 1台部署节点(配一块硬盘,运行ceph-depoly) 3 ...

  3. 2.2 CPU 上下文切换是什么意思?(下)

    怎么查看系统的上下文切换情况 过多的上下文切换,会把 CPU 时间消耗在寄存器.内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个 元凶. 使用 vmstat ...

  4. Python发送SMTP邮件指南

      SMTP(Simple Mail Transfer Protocol)简单邮件传输协议,Python内置对SMTP的支持,可以发送纯文本文件,HTML邮件以及附带文件.   一.两个模块 Pyth ...

  5. Python+Selenium自动化-设置等待三种等待方法

    Python+Selenium自动化-设置等待三种等待方法   如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候,就需要我们通过设置一个等待条件,等待页面元素加载完成,避免出现 ...

  6. 七、Numpy高效数据处理

    Numpy的主要作用是进行矩阵运算 在使用时首先要导入包 import numpy as np np.version.version 用来查看版本信息 # 构建一维数组 n1=np.array([1, ...

  7. 『动善时』JMeter基础 — 36、JMeter接口关联【正则表达式提取器】

    目录 1.正则表达式提取器介绍 2.正则表达式提取器界面详解 3.正则表达式提取器的使用 (1)测试计划内包含的元件 (2)请求一界面内容 (3)正则表达式提取器界面内容 (4)请求二界面内容 (5) ...

  8. Mybatis基础使用方法

    1.首先在数据库中建立一张表 create table login( name varchar(20) not null, username varchar(20) not null, passwor ...

  9. Go string 详解

    前言 字符串(string) 作为 go 语言的基本数据类型,在开发中必不可少,我们务必深入学习一下,做到一清二楚. 本文假设读者已经知道切片(slice)的使用,如不了解,可阅读 Go 切片 基本知 ...

  10. Paddle Inference推理部署

    Paddle Inference推理部署 飞桨(PaddlePaddle)是集深度学习核心框架.工具组件和服务平台为一体的技术先进.功能完备的开源深度学习平台,已被中国企业广泛使用,深度契合企业应用需 ...