[Spring]事务的传播机制

一、背景

Mysql在修改完数据后,默认会自动触发事务Commit提交。
而在我们服务的一个方法里,需要多次修改Mysql记录。
为了保证原子性,我们需要将Mysql设为手动提交,多次修改后再commit提交。

二、Spring事务

1、编程式事务管理

TransactionTemplate三组件
PlatformTransactionManager事务管理器,用于管理事务的开始、提交和回滚。
TransactionDefinition事务定义,用于定义事务的隔离级别、超时时间、只读等。
TransactionCallback事务回调,用于执行具体的业务逻辑。

使用1

 private TransactionTemplate transactionTemplate;public void MyTransaction() {transactionTemplate.execute((status -> {try {//todoreturn null;} catch (Exception e){status.setRollbackOnly();}return null;}));}

使用2

 @Autowired
private PlatformTransactionManager transactionManager;public void testTransaction() {TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());try {//代码实现transactionManager.commit(transactionStatus);} catch (Exception e) {transactionManager.rollback(transactionStatus);}
}

2、声明式事务管理

@Transactional

标注位置

  • 标注在方法上,它会在方法执行期间开启一个新的事务。如果方法成功完成,则提交事务。如果方法抛出异常,则回滚事务。
  • 标注在类上时,它会应用于类中的所有公共方法,并且可以通过在方法上指定propagation属性来覆盖类级别的行为。

属性

  • propagation : 事务传播行为
  • isolation :事务隔离级别
  • timeout :定义事务的超时时间(单位为秒)。默认值为-1,表示使用数据库的默认超时时间。
  • readOnly:是否只读。默认值为false,表示允许读写操作。如果设置为true,则只允许读操作。
  • rollbackFor:指定哪些异常需要回滚事务。默认值为RuntimeException和Error。可以指定其他异常,并且可以指定多种异常,例如rollbackFor={SQLException.class,MyException.class}。
@Transactional(propagation = Propagation.REQUIRED)
public void MyMethod {//你的业务代码
}

三、Spring事务传播机制

假如我们的事务方法,修改了某些数据。
但是!!!里面还调用了另一个事务方法,那该怎么处理???
我们是要将当它们当成一个事务?还是两个事务??
Spring提供了七种策略,可以让我们去选择。

Spring提供了七种策略(事务传播机制

事务的传播机制
PROPAGATION_REQUIRED支持当前事务,如果当前没有事务,就新建一个事务。(默认)。
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

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

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

相关文章

leetCode 583.两个字符串的删除操作 动态规划 + 优化空间复杂度(二维dp、一维dp)

583. 两个字符串的删除操作 - 力扣(LeetCode) 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1: 输入: word1 "sea", word2 &qu…

Go HTTP 调用(下)

今天分享的内容是 Go HTTP 调用。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出! 前言 上篇文章 Go HTTP 调用&#…

基于springboot实现校园闲置物品交易平台系统项目【项目源码+论文说明】

基于springboot实现校园闲置物品交易平台系统演示 摘要 社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的交易方式逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。互联网具有便利性,速度快,效率高&am…

nodejs+vue+elementui酒店客房服务系统mysql带商家

视图层其实质就是vue页面,通过编写vue页面从而展示在浏览器中,编写完成的vue页面要能够和控制器类进行交互,从而使得用户在点击网页进行操作时能够正常。 简单的说 Node.js 就是运行在服务端的 JavaScript。 前端技术:nodejsvueel…

Faust勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

引言: Faust勒索病毒是一种致命的网络威胁,它以强力数据加密为手段,将您的文件变成无法触及的谜题。如果不幸感染,您将面临一个无情的选择:支付比特币赎金或永远失去宝贵的数据。以下是如何理解Faust勒索病毒&#xf…

提高爬虫效率的秘诀之一:合理配置库池数量

在提高爬虫效率的过程中,合理配置库池数量是一个重要的秘诀。通过增加或减少库池的数量,可以有效提升爬虫系统的效率和稳定性。本文将介绍如何合理配置库池数量,以及配置不同数量库池的优缺点,帮助您提高爬虫效率,顺利…

基于单目相机的2D测量(工件尺寸和物体尺寸)

目录 1.简介 2.基于单目相机的2D测量 2.1 想法: 2.2 代码思路 2.2 主函数部分 1.简介 基于单目相机的2D测量技术在许多领域中具有重要的背景和意义。 工业制造:在工业制造过程中,精确测量是确保产品质量和一致性的关键。基于单目相机的2…

Go语言入门心法(二): 结构体

Go语言入门心法(一) Go语言入门心法(二): 结构体 一: Go语言中结构体认知 go语言中的结构体认知升维:go语言中的结构体本身是一种自定义的数据类型,即然是数据类型,则可以用来声明其他的变量,被声明的变量即为结构体的实例对象go语言中的结构体融合了c语言中的结构体体征和面…

OpenCV6-图形绘制

OpenCV6-图形绘制 1.绘制圆形2.绘制直线3.绘制椭圆4.绘制多边形5.文字生成6.demo 1.绘制圆形 void cv::circle(InputOutputArray img, // 需要绘制圆形的图像Point center, // 圆心坐标int radius, // 半径,单位为像素const Scalar& colo…

Xshell7和Xftp7超详细下载教程(包括安装及连接服务器附安装包)

1.下载 1.官网地址: XSHELL - NetSarang Website 选择学校免费版下载 2.将XSHELL和XFTP全都下载下来 2.安装 安装过程就是选择默认选项,然后无脑下一步 3.连接服务器 1.打开Xshell7,然后新建会话 2.填写相关信息 出现Connection establi…

JVM 性能调优参数

JVM分为堆内存和非堆内存 堆的内存分配用-Xms和-Xmx -Xms分配堆最小内存,默认为物理内存的1/64; -Xmx分配最大内存,默认为物理内存的1/4。 非堆内存分配用-XX:PermSize和-XX:MaxPermSize -XX:PermSize分配非堆最小内存,默认为物理…

【LeetCode高频SQL50题-基础版】打卡第5天:第26~30题

文章目录 【LeetCode高频SQL50题-基础版】打卡第5天:第26~30题⛅前言超过5名学生的课🔒题目🔑题解 求关注者的数量🔒题目🔑题解 只出现一次的最大数字🔒题目🔑题解 买下所有产品的客户&#x1f…

《进化优化》第4章 遗传算法的数学模型

文章目录 4.1 图式理论4.2 马尔可夫链4.3 进化算法的马尔可夫模型的符号4.4 遗传算法的马尔可夫模型4.4.1 选择4.4.2 变异4.4.3 交叉 4.5 遗传算法的动态系统模型4.5.1 选择4.5.2 变异4.5.3 交叉 4.1 图式理论 图式是描述一组个体的位模式,其中用*来表示不在乎的位…

如何在Ubuntu 20.04.6 LTS系统上运行Playwright自动化测试

写在前面 这里以 Ubuntu 20.04.6 LTS为例。示例代码:自动化测试代码。 如果过程中遇到其他非文本中提到的错误,可以使用搜索引擎搜索错误,找出解决方案,再逐步往下进行。 一、 环境准备 1.1 安装python3 1.1.1 使用APT安装Py…

dll文件缺失,ps,pr无法打开,游戏运行不了如何解决

最近重装了系统,然后打开原来的软件发现都会报错,说***.dll文件缺失 于是找了很多解决办法 方案一 说是下载一个dll文件恢复助手,一键恢复 不要信 统统不管用,不是收费高就是没作用 方案二 下载对应dll文件去c盘对应软件位置…

python+opencv+深度学习实现二维码识别 计算机竞赛

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 pythonopencv深度学习实现二维码识别 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:3分 该项目较为新颖&…

Sqlite3 查询 今日、昨日、本周、上周、本月、上月、本季度、上季度、本年

一、使用Between AND select * from 表名 where 字段名 Between ‘2019-1-01 00:00:00’ AND ‘2019-7-12 23:59:59’ 二、使用>,< select * from 表名 where 字段名 > ‘2019-1-01 00:00:00’ and 字段名 < ‘2019-12-12 23:59:59’ 三、升降序 select * from 表…

mathtype嵌入到wps中

首先你需要保证你有一个mathtype&#xff0c;mathtype的安装很简单&#xff0c;请自行查找资料 然后将mathtype嵌入到哪里是一个问题&#xff0c;网上的教程很多&#xff0c;但是一般分为两种&#xff0c;wps和word 那么&#xff0c;我为什么选取wps&#xff1f; 因为word频频碰…

BAT学习——计算当前路径下指定格式文件的MD5值,将文件名与MD5值写入文本

将以下内容粘贴到bat脚本中&#xff0c;双击运行&#xff0c;生成MD5.txt文件&#xff0c;需要其他格式&#xff0c;修改循环中的.rar 多个格式使用or分开 *.rar or *.bat脚本内容 echo off setlocal enabledelayedexpansionrem 设置输出文件名 set "outputFileMD5.txt&…

跨语言深入探讨如何实现方法增强:Java Go的多策略实现

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…