【Spring Boot 事务管理】
Spring Boot 事务管理
- 一、Spring Boot中的事务管理
- 1.声明式事务管理
- @Transactional注解
- 基本使用
- 配置选项
- 2.编程式事务管理
- TransactionTemplate
- PlatformTransactionManager
- 二、@Transactional注解深入
- 1.基本使用
- 基本属性
- 2.传播行为
- 3.隔离级别
- 4.事务超时设置
- 5.回滚规则
- 三、事务管理的最佳实践
- 1.事务边界的确定
- 2.只读事务的使用
- 3.避免编程式事务
一、Spring Boot中的事务管理
1.声明式事务管理
@Transactional注解
Spring最常用的事务管理方式是声明式事务管理,主要通过@Transactional注解实现。这种方式的优点在于简单易用,通过将注解添加到类或方法上,开发者可以轻松地控制事务的边界,而无需直接与底层的事务管理API打交道。
基本使用
在方法级别上使用@Transactional注解,可以确保该方法内的所有操作要么全部成功,要么在遇到异常时全部回滚。
import org.springframework.transaction.annotation.Transactional;@Transactional
public void updateUserData(User user) {// 这里的数据库操作会在一个事务中执行
}
配置选项
@Transactional注解提供了多种配置选项,包括事务的传播行为、隔离级别、超时设置等。
2.编程式事务管理
使用TransactionTemplate或直接使用PlatformTransactionManager,可以在代码中精确控制事务的边界。
TransactionTemplate
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.support.TransactionTemplate;public class UserService {@Autowiredprivate TransactionTemplate transactionTemplate;public User createUser(final User user) {return transactionTemplate.execute(status -> {// 这里的操作会在一个事务中执行return userRepository.save(user);});}
}
PlatformTransactionManager
对于需要完全控制事务行为的场景,Spring还允许直接使用PlatformTransactionManager。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;public class UserServiceImpl implements UserService {@Autowiredprivate PlatformTransactionManager transactionManager;public void updateUser(User user) {TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());try {// 这里的操作会在一个事务中执行userRepository.update(user);transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);throw e;}}
}
二、@Transactional注解深入
1.基本使用
@Transactional注解可以应用于类或方法级别。当应用于类级别时,该类中的所有公共方法都会被应用事务管理。当应用于方法级别时,只有标注了该注解的方法才会进行事务管理。
基本属性
readOnly: 指定事务是否为只读事务。只读事务可以帮助数据库引擎优化事务。propagation: 指定事务的传播行为。isolation: 指定事务的隔离级别。timeout: 定义事务的超时限制(以秒为单位)。rollbackFor: 指定哪些异常可以触发事务回滚。noRollbackFor: 指定哪些异常不应触发事务回滚。
2.传播行为
事务的传播行为定义了事务边界的创建方式。Spring定义了多种传播行为:
REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。REQUIRES_NEW: 总是创建一个新的事务,如果当前存在事务,则挂起当前事务。NOT_SUPPORTED: 总是以非事务方式执行,如果当前存在事务,则挂起当前事务。NEVER: 总是以非事务方式执行,如果当前存在事务,则抛出异常。NESTED: 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则表现同REQUIRED。
3.隔离级别
隔离级别定义了一个事务可能受其他并发事务影响的程度。Spring支持以下隔离级别:
DEFAULT: 使用底层数据源的默认隔离级别。READ_UNCOMMITTED: 允许读取未提交的更改。READ_COMMITTED: 仅允许读取已提交的更改。REPEATABLE_READ: 确保在事务内重复读取同一记录的结果一致。SERIALIZABLE: 完全隔离,确保事务串行化执行。
4.事务超时设置
通过@Transactional注解的timeout属性,可以为事务指定超时时间。如果事务执行时间超过了指定的时间限制,Spring将自动回滚事务。
5.回滚规则
通过@Transactional注解的rollbackFor和noRollbackFor属性,可以精确控制异常回滚行为:
rollbackFor: 指定哪些异常应该触发事务回滚。noRollbackFor: 指定哪些异常不应该触发事务回滚。
三、事务管理的最佳实践
1.事务边界的确定
事务边界定义了事务的开始和结束,合理的事务边界可以确保事务既不过大也不过小。
- 定义清晰的业务逻辑单元:每个事务应该对应一个清晰定义的业务逻辑单元。不应该让一个事务覆盖多个不相关的操作。
- 避免长事务:长事务会占用数据库资源,增加锁定的范围和时间,从而影响并发性能。尽量避免不必要的长事务,及时提交或回滚。
- 事务中的操作数量:虽然理论上事务可以包含任意数量的操作,但是在实践中,应该避免在单一事务中包含过多的操作。如果业务逻辑允许,可以将一个大事务分解为几个小事务,以提高并发性和系统稳定性。
2.只读事务的使用
只读事务是指不包含任何修改(插入、更新、删除)操作的事务。只读事务的使用有以下好处:
- 性能优化:数据库可以对只读事务进行优化,如减少锁的使用,提升查询性能。
- 减少副作用:标记为只读的事务明确告诉数据库和应用程序这个事务不会修改数据,有助于避免由于错误的数据修改导致的问题。
何时使用只读事务:
- 数据查询操作:当事务仅包含数据查询操作,不涉及任何数据修改时,应将事务标记为只读。
- 报表生成:生成报表或执行大量查询以分析数据时,使用只读事务可以提高效率。
3.避免编程式事务
尽管Spring提供了编程式事务管理的能力,但在大多数情况下,推荐使用声明式事务管理(@Transactional注解)原因如下:
- 简化开发:声明式事务管理通过注解的方式,减少了编程的复杂度,使得事务管理更加直观和易于理解。
- 减少代码侵入性:使用声明式事务管理,事务代码与业务代码分离,降低了代码的耦合度,提高了代码的可读性和可维护性。
- 统一事务管理:声明式事务管理提供了一种统一的事务管理机制,使得事务管理更加标准化,易于跟踪和维护。
相关文章:
【Spring Boot 事务管理】
Spring Boot 事务管理 一、Spring Boot中的事务管理1.声明式事务管理Transactional注解基本使用配置选项 2.编程式事务管理TransactionTemplatePlatformTransactionManager 二、Transactional注解深入1.基本使用基本属性 2.传播行为3.隔离级别4.事务超时设置5.回滚规则 三、事务…...
【C++】C++指针在线程中调用与受保护内存空间读取方法
引言 在C的多线程编程中,正确地管理内存和同步访问是确保程序稳定性和安全性的关键。特别是当涉及到指针在线程中的调用时,对受保护内存空间的访问必须谨慎处理,以防止数据竞争、死锁和内存损坏等问题。本文将详细探讨C指针在线程中调用时如何…...
安全隔离上网的有效途径:沙箱
在数字化浪潮日益汹涌的今天,网络安全成为了不可忽视的重要议题。沙箱技术作为一种高效的隔离机制,为企业和个人提供了一种在享受网络便利的同时,保障系统安全的解决方案。本文旨在深入探讨沙箱技术如何做到隔离上网,从而为用户提…...
jenkins下后台运行链接Jenkins服务脚本方法
为了编写一个用于在后台运行 Jenkins agent 的批处理脚本,你可以使用 start 命令来启动 Java 进程并将其设置为在后台运行。以下是一个示例批处理脚本 run_agent.bat: bat echo off setlocalREM Set the path to the Jenkins agent JAR file set AGENT…...
宠物空气净化器哪个品牌性价比高?宠物空气净器Top3品牌推荐
养猫确实给家庭带来了无尽的欢乐,但猫毛无处不在的问题确实让不少猫主人感到头疼。不论是长毛猫还是短毛猫,它们掉落的浮毛飘浮在空气中,不仅影响家居环境的整洁度,还可能成为过敏的源头。因此,如何高效地处理这些猫浮…...
苏州大厂面试题JAVA 面试集
基础知识1、强引用、软引用、弱引用、幻象引用有什么区别?(java基础) 答案参考:https://time.geekbang.org/column/article/6970 2、 对比Hashtable、HashMap、TreeMap有什么不同?(数据结构) 答案参考:https://time.geekbang.org/column/article/8053 3、一个线程调用两次…...
数据库取出来的日期格式是数组格式,序列化日期格式
序列化前,如图所示: 解决方式,序列化日期(localdatetime)格式 步骤一、添加序列化类 package com.abliner.test.common.configure;import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fas…...
【Android】创建一个可以在屏幕上拖动的悬浮窗
项目需求 在界面上创建一个悬浮窗,可以自由的移动这个悬浮窗 需求解决 1.添加权限 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW"/>2.请求权限 从 Android 6.0 (API 23) 开始,应用需要动态请求显示悬浮窗…...
SPI NAND、SD NAND和eMMC对比—MK米客方德
目录 1. 容量: 2.封装类型: 3.速度: 4.性能: 5.寿命: 6. 使用方式: 7. 其他优缺点: 8.常见应用场景: 1. 容量: SPI NAND通常提供从几百MB到几GB的存储容量。 SD NAND的容量覆盖范围比SPI NAND更广,从几GB到几十GB不等。 eMMC的容量范围更大&a…...
“深入解析:YUM仓库、RPM包与源码编译——Linux软件安装方式全面对比“
目录 YUM 仓库安装 概念: 优点: 缺点: RPM 包安装 概念: 优点: 缺点: 源码编译安装 概念: 优点: 缺点: 三者区别 YUM 仓库安装 概念: YUM&…...
中电金信:银行业私有云何去何从
2009年,云计算开始从概念走向实践。在这一年,Gartner在预测2010十大发展趋势中,将云计算列在榜首。在这之后,谷歌、亚马逊、IBM等科技巨头纷纷加码对云计算的研发投入。2010年正式迎来云计算时代,这一年也被定为“云元…...
Adobe Acrobat Pro或者Adobe Acrobat Reader取消多标签页显示,设置打开一个pdf文件对应一个窗口。
Windows系统:Adobe Acrobat Pro或者Adobe Acrobat Reader首选项-一般-取消在同一窗口的新标签中打开文档(需要重启)的对勾,点击确定,彻底关闭后重启,这样打开的每一个PDF文件对应的是一个窗口,并…...
从0开始学习pyspark--pyspark的数据读取[第4节]
在PySpark中,读取文件型数据是一个常见的操作,Spark支持多种数据格式,如CSV、JSON、Parquet、Avro等。以下是一些常用的方法来读取不同格式的文件数据。 读取文本型数据 读取CSV文件: 使用spark.read.csv方法读取CSV文件,可以通…...
极速升级:MacOS系统中Pip源的切换指南
极速升级:MacOS系统中Pip源的切换指南 在MacOS系统中,Python的包管理工具Pip是我们管理和安装Python库的得力助手。然而,默认的Pip源在国外,对于国内用户来说,访问速度可能较慢。因此,更换Pip源以提高下载…...
服务器的分类,主流服务器的应用场景
一、服务器分类 服务器可以按应用层次、体系架构、用途、外形等进行分类。以下是详细说明: 按应用层次分类 入门级服务器:这些服务器一般用于小型企业或部门的简单任务,如文件共享和打印服务。工作组级服务器:适用于中小型企业&…...
Objects and Classes (对象和类)
Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes (使用类) Ref…...
从单点到全景:视频汇聚/安防监控EasyCVR全景视频监控技术的演进之路
在当今日新月异的科技浪潮中,安防监控领域的技术发展日新月异,全景摄像机便是这一领域的杰出代表。它以其独特的360度无死角监控能力,为各行各业提供了前所未有的安全保障,成为现代安防体系中的重要组成部分。 一、全景摄像机的技…...
Java学习 -Golang开发环境+目录结构+编译+部署
开发环境 环境变量设置 GOROOT 指定 golang sdk 的安装目录GOPATH golang 工作目录,项目的源码放在这个目录下PATH 将 GOROOT/bin 放在 Path 路径下,方便命令行能直接运行 golang的命令行工具项目目录结构 |--project // 位于G…...
Redis 典型应用——缓存(缓存预热,穿透,雪崩,击穿)
一、缓存 缓存是计算机中一个很经典的概念,核心思路是把一些常用的数据放到访问速度更快的地方,方便随时读取; 但对于计算机硬件来说,往往访问速度越快的设备,成本越高,存储空间越小,缓存是更…...
Sharding-JDBC分库分表的基本使用
前言 传统的小型应用通常一个项目一个数据库,单表的数据量在百万以内,对于数据库的操作不会成为系统性能的瓶颈。但是对于互联网应用,单表的数据量动辄上千万、上亿,此时通过数据库优化、索引优化等手段,对数据库操作…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...
