Spring的事务传播机制有哪些

Spring的事务传播机制有哪些?

Spring的事务传播机制用于控制在多个事务方法相互调用时事务的行为。

在复杂的业务场景中,多个事务方法之间的调用可能会导致事务的不一致,如出现数据丢失、重复提交等问题,使用事务传播机制可以避免这些问题的发生,保证事务的一致性和完整性。

Spring的事务规定了7种事务的传播级别,默认的传播机制是REQUIRED

REQUIRED,如果不存在事务则开启一个事务,如果存在事务则加入之前的事务,总是只有一个事务在执行
REQUIRES NEW,每次执行新开一个事务,如果当前存在事务,则把当前事务挂起
SUPPORTS,有事务则加入事务,没有事务则普通执行
NOT SUPPORTED,有事务则暂停该事务,没有则普通执行
MANDATORY,强制有事务,没有事务则报异常
NEVER,有事务则报异常
NESTED,如果之前有事务,则创建嵌套事务,嵌套事务回滚不影响父事务,反之父事务影响嵌套事务

扩展知识

用法

假设有两个业务方法A和B,方法A在方法B中被调用,需要在事务中保证它们的一致性,如果方法A或方法B中的任何一个方法发生异常,则需要回滚事务。

使用Spring的事务传播机制,可以在方法A和方法B上使用相同的事务管理器,并通过设置相同的传播行为来保证事务的一致性和完整性。具体实现如下:

@service
public class TransactionFooservice{@Autowired
private FooDao fooDao;@Transactional(propagation =Propagation,REQUIRED, rollbackFor = Exception.class)
public void methodA()throws Exception {// do somethingfooDao.updateFoo();}
}@service
public class TransactionBarservice {@Autowiredprivate BarDao barDao;@Autowiredprivate TransactionFooService transactionFooservice;@Transactional(propagation =Propagation.REQUIRED, rollbackFor = exception.class)public void methodB()throws Exception{// do somethingbarDao.updateBar();transactionFooservice.methodA();}
}

在上述示例中,方法A和方法B都使用了REQUIRED的传播行为,表示如果当前存在事务,则在当前事务中执行;如果当前没有事务,则创建一个新的事务。如果在方法A或方法B中出现异常,则整个事务会自动回滚。

rollbackFor

rollbackFor是Spring事务中的一个属性,用于指定哪些异常会触发事务回滚。
在一个事务方法中,如果发生了rollbackFor属性指定的异常或其子类异常,则事务会回滚。如果不指定rollbackFor,则默认情况下只有RuntimeException和Error会触发事务回滚。

场景题

问:一个长的事务方法a,在读写分离的情况下,里面既有读库操作,也有写库操作,再调用个读库方法b,方法b该用什么传播机制呢?

这种情况,读方法如果是最后一步,直接not supported就行了,避免读报错导致数据回滚。如果是中间步骤最好还是要required,因为异常失败需要回滚一下。

例如:ABC三个操作,C就是最后一步,B就是中间步骤,
如果一个读操作在中间(如B操作)失败了,那么就需要让A做回滚,因为C还没执行,所以A必须回滚才能保证一致性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scala 04 —— 函数式编程底层逻辑

函数式编程 底层逻辑 该文章来自2023/1/14的清华大学交叉信息学院助理教授——袁洋演讲。 文章目录 函数式编程 底层逻辑函数式编程假如...副作用是必须的?函数的定义函数是数据的函数,不是数字的函数如何把业务逻辑做成纯函数式?函数式编程…

【python】直接在python3下安装 jupyter notebook,以及处理安装报错,启动不了问题

目录 问题: 1 先做准备,查看环境 1.1 先看python3 和pip ,以及查看是否有 juypter 1.2 开始安装 1.3 安装完成后得到警告和报错 2 处理安装的报错问题 2.1 网上有说是因为 pip 自身需要更新,更新之 2.1.1 更新pip 2.1.…

从写博客到现在的感受

从写博客开始到现在我已经写了35篇博客了,慢慢的了解发现,越是深入了解代码,我就感觉到自己的渺小与不足,感觉要写的东西实在是太多了,我发现:以前我是个初学小白,现在依然是个初学小白&#xf…

c++复习笔记

前言 为什么写C复习笔记?脑子不好使,今天学明天忘。 为什么一堆代码?代码是敲出来的,不是看出来的。里面的代码都运行过,萌新跟着敲就完事了,也有注释辅助理解。至于有基础的,代码就这么点&am…

互联网十万个为什么之什么是产品经理?

什么是产品经理? 你知道每当你打开手机,点开一个应用程序,或者在网上购物时,那背后的幕后英雄是谁吗?这就是产品经理。他们是那些负责设计、开发和推广产品的人,他们的工作是确保你的体验顺畅而愉快。 产…

Redis搭建主从

Redis搭建主从: 1:拉取Redis镜像 docker pull redis2:创建主从对应的目录结构 3:对redis6379.log,redis6380.log,redis6381.log进行授权 chmod 777 redis6379.log chmod 777 redis6380.log chmod 777 redis6381.log4:修改主(master)的配置文件 5:创建主(master) redis_6379 …

Linux命令学习—Mail 服务器

1.1、Mail 服务器的组成 1、电子邮局 2、电子邮件发送和接收系统 3、MUA(邮件用户代理)和 MTA(邮件传输代理) 1.2、Mail 系统相关协议 1、SMTP 协议 简单邮件传输协议 SMTP 协议使用 25 端口: SMTP(Simple Mail T…

docker部署java项目,如何docker-compose内的jdk版本与本地版本保持一致

目录结构 /var └── data├── docker-compose.yml └── docker├── Dockerfile└── jdk-8u401-linux-x64.tar.gzdockerfile文件 FROM ubuntu:latest# 拷贝本地服务器上的 JDK 安装包到 Docker 镜像中 COPY jdk-8u401-linux-x64.tar.gz /jdk-8u401-linux-x64.tar.g…

使用自定义OCR提升UIE-X检测效果:结合PaddleOCR和UIE模型进行文档信息提取

在实际应用中,识别文档中的特定信息对于许多任务至关重要,例如发票识别、表格信息提取等。然而,由于文档的多样性和复杂性,传统的光学字符识别(OCR)技术可能无法准确识别文档中的信息。为了解决这个问题&am…

TCP断开连接为什么需要4次挥手?

一、断开连接过程 由于TCP连接是全双工的,因此每个方向都必须单独关闭。客户端在数据发送完毕后发送一个结束数据段FIN,且服务端也返回确认数据段ACK,此时结束了客户端到服务端的连接;然后客户端接收到服务端发送的FIN&#xff0c…

MyBatis 面试题(二)

1. MyBatis 编程步骤是什么样的? MyBatis 的编程步骤通常包括以下几个主要阶段: 创建 MyBatis 配置文件: 首先,你需要创建一个 MyBatis 的配置文件(通常是 mybatis-config.xml)。这个文件包含了 MyBatis 的…

基于弹簧鞘复合纱和迁移学习算法的可穿戴人体重构和智能试衣系统

研究背景 在信息时代和元宇宙的背景下,虚拟服装设计对满足服装行业的个性化需求至关重要。与传统方法不同,虚拟试衣节省时间、方便客户,并提供多样化的款式。准确得测量人体围度并重构出人体的模型是虚拟试衣的关键。为了实现动态人体重构&a…

抽象类和接口的异同之处

参考链接:C#:浅析接口(interface)与抽象类(abstract)的区别 接口与抽象类的相同点 ​ (1)都不能使用new关键字来实例化 ​ (2)成员方法都没有实现部分&…

【面试经典 150 | 二叉树层序遍历】二叉树的右视图

文章目录 写在前面Tag题目来源解题思路方法一:层序遍历方法二:深度优先搜索 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于…

Java静态绑定和动态绑定

java动态绑定和静态绑定 在Java中,绑定是指将一个方法调用与方法体连接起来的过程。Java支持两种类型的绑定:静态绑定(也称为早期绑定)和动态绑定(也称为晚期绑定或虚拟调用)。区分这两种绑定方式主要取决…

串口通信如何控制步进电机转动?

在自动化控制系统中,步进电机的控制是一项重要的技术任务。通过串口通信控制步进电机转动,可以实现远程控制和自动化操作,提高生产效率和降低人工成本。本文将详细介绍串口通信控制步进电机转动的关键步骤和技术要点。 首先,我们…

【Linux】进程和计划任务

目录 一、进程介绍 1.1 进程与线程的定义 1.1.1 进程(Process)** 1.1.2 线程(Thread)** 1.1.3 进程与线程的区别 1.2 进程的特征 1.3 进程状态 1.3.1 进程的基本状态 1.3.2 进程更多的状态 1.4 进程的优先级 1.5 进程间通信 1.6 进程的分类* 二、进程管理 2.1 查看…

使用Python操作SQLite

1、连接数据库 import sqlite3 conn sqlite3.connect(example.db)其中 example.db 是数据库文件名,如果不存在则会自动创建。connect() 方法还可以接收多个参数,用于设置连接属性,如 conn sqlite3.connect(example.db, isolation_levelNo…

【shell编程系统巡检项目】

目录 系统巡检指标信息代码 系统巡检 所谓系统巡检就是就是定时检查系统的各项指标,与监控互补。 指标信息 1.基本信息:主机名,ip地址,公网ip,系统发行版本,内核版本,cpu架构 hostname hostname -i curl…

SpringBoot项目创建及简单使用

目录 一.SpringBoot项目 1.1SpringBoot的介绍 1.2SpringBoot优点 二.SpringBoot项目的创建 三.注意点 一.SpringBoot项目 1.1SpringBoot的介绍 Spring是为了简化Java程序而开发的,那么SpringBoot则是为了简化Spring程序的。 Spring 框架: Spring…