Spring的事务传播机制有哪些

news/2024/5/3 9:20:00

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.mrgr.cn/p/22175478

相关文章

【Entity Framework】闲话EF中批量配置

【Entity Framework】闲话EF中批量配置 文章目录 【Entity Framework】闲话EF中批量配置一、概述二、OnModelCreating中的批量配置元数据API的缺点 三、预先约定配置忽略类型默认类型映射预先约定配置的限制约定添加新约定替换现有约定约定实现注意事项 四、何时使用每种方法进…

Rust实现hotkey

最近想写一个快捷启动工具来满足自己的需求,刚好用自己最喜欢的 Rust 来实现实现方法 文档: global_hotkey 具体代码 use global_hotkey::{hotkey::{Code, HotKey, Modifiers},GlobalHotKeyEvent, GlobalHotKeyManager, HotKeyState, }; use winit::event_loop::{ControlFlow,…

2024面试软件测试,常见的面试题(上)

一、综合素质 1、自我介绍 面试官您好,我叫XXX,一直从事车载软件测试,负责最多的是中控方面。 以下是我的一些优势: 车载的测试流程我是熟练掌握的,且能够独立编写测试用例。 平时BUG提交会使用到Jira,类似…

海外云手机为什么适合社媒运营?

如今,社媒营销如果做得好,引流效果好的账号,可以用来带货变现,而外贸、品牌出海也同样都在做社媒营销,Tik Tok、facebook、ins等热门的海外社媒平台都是行业密切关注的,必要的时候,大家会使用海…

高级IO和5种IO模型

目录 1. 高级IO1.1 IO的基本概念1.2 OS如何得知外设当中有数据可读取1.3 OS如何处理从网卡中读取到的数据包1.4 IO的步骤 2. 五种IO模型2.1 利用钓鱼来理解2.2 阻塞IO2.3 非阻塞IO2.4 信号驱动IO2.5 IO多路转接2.6 异步IO 3. 高级IO的概念3.1 同步通信 VS 异步通信3.2 阻塞 VS …

FineReport11 报表技巧02- 实现类Excel表头筛选功能

背景: 在报表开发中,有的需求方用习惯Excel的表头筛选时,就不太习惯帆软的特意点击报表控件进行筛选,希望报表筛选方式可以类似Excel那种直接在表头进行筛选的功能 最终效果如下:实现步骤: 1.1、数据集准备 产品信息表: SELECT 客户,产品,数量,cast(下单时间 as date) a…

项目冲刺

项目冲刺汇总 第一天 第二天 会议图片第三天 会议图片第四天 会议图片第五天 会议图片第六天 会议图片第七天 会议图片燃尽图

正则表达式(Regular Expression)

正则表达式很重要,是一个合格攻城狮的必备利器,必须要学会!!! (参考视频)10分钟快速掌握正则表达式(奇乐编程学院)https://www.bilibili.com/video/BV1da4y1p7iZ在线测试…

CommunityToolkit.Mvvm笔记---ObservableValidator

ObservableValidator 是实现 INotifyDataErrorInfo 接口的基类,它支持验证向其他应用程序模块公开的属性。 它也继承自 ObservableObject,因此它还可实现 INotifyPropertyChanged 和 INotifyPropertyChanging。 它可用作需要支持属性更改通知和属性验证的…

MyBatis 中的动态 SQL 的相关使用方法

为什么会有动态SQL,把SQL写死不是比较方便吗?其实有很多的举例,这里我那一个常见的来说,像我们用户注册,会有必填字段和非必填字段,有些传来的参数不一样,那对应的SQL也不一样,因此&…

HarmonyOS NEXT应用开发之下拉刷新与上滑加载案例

介绍 本示例介绍使用第三方库的PullToRefresh组件实现列表的下拉刷新数据和上滑加载后续数据。 效果图预览使用说明进入页面,下拉列表触发刷新数据事件,等待数据刷新完成。 上滑列表到底部,触发加载更多数据事件,等待数据加载完成。实现思路使用第三方库pullToRefresh组件,…

基于51单片机的自行车测速里程码表设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机的自行车测速里程码表设计 1. 主要功能:2. 讲解视频:3. 仿真设计4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单资料下载链接: 基于51单片机的自行车测速里程码表设计( proteus仿真程序设计报告原理图讲解视频)…

Redis Cluster 集群部署

目录一、什么是redis Cluster集群二、集群架构图三、redis Cluster部署架构1、测试环境2、生产环境四、原生命令手动部署Redis Cluster1、环境准备2、为所有节点启用redis集群支持3、执行meet操作实现互相通信在任意一节点上和其它所有节点进行meet通信,以m1为例4、为每个mast…

2024-9.python文件操作

文件操作 引言 到目前为止,我们做的一切操作,都是在内存里进行的,这样会有什么问题吗?如果一旦断电或发生意外关机了,那么你辛勤的工作成果将瞬间消失。是不是感觉事还挺大的呢?现在你是否感觉你的编程技…

第七天博客

第七天随笔 会议照昨天工作完成总结 黄永名: 今天的测试人员测出了一些bug,有关于sql语句的。不过文档有点不太直观,细致的看了一下。出现了无法通过作者名检索书籍的情况,于是在数据库上用sql语句测试了一下,并没有出现问题。还有很多类似这样的情况,比如无法注册管理员…

conda安装好了虚拟环境,可以在pycham里导入xpotato库,但是在jupyter notebook中却导入不了

问题描述 使用conda安装好了虚拟环境,可以在pycham里导入xpotato库,但是在jupyter notebook中却导入不了 原因 虽然是在anaconda Prompt的环境中进入的Jupyter Notebook,但是Jupyter Notebook的默认内核却不是那个环境,需要重新更…

Vue3从入门到实践:深度了解新组件

1.Teleport 概念:Teleport(传送门)是一个新的特性,用于在DOM中的任意位置渲染组件。它允许你将组件的内容渲染到DOM中的另一个位置,而不受组件层次结构的限制。 下面举出例子解释: 1.新建App.vue文件作…

古典密码之棋盘密码(ADFGVX,ADFGX,Polybius)

引言 棋盘密码只加密字母,不区分大小写(ADFGVX棋盘还可加密数字),若输入其它字符则原样保留。若输入多行(段落),每行是单独加密的。 Polybius/ADFGX棋盘由于I/J在同一格,解密后需人工确认I和J。 ADFGX/ADFGVX棋盘原则上需要密钥二次加密,但可留空不使用密钥。若使用,…

射影几何学笔记

给大家拉坨大的。 在中学阶段,我们就研究过欧几里得平面上的几何。在初中阶段我们学习了平移与旋转,在高中阶段我们学习了仿射,这些几何变换有一个共同点:保持共线三点与共点三线在变换后仍共线或共点。然而在生活中,除了这些变换以外,还有更一般的变换也拥有这个性质:比…