Spring学习笔记_29——@Transactional
@Transactional
1. 介绍
@Transactional 是 Spring 框架提供的一个注解,用于声明方法或类级别的事务属性。
Spring事务:Spring学习笔记_28——事务-CSDN博客
当你在一个方法或类上使用 @Transactional 注解时,Spring 会为该方法或类创建一个事务代理,以确保方法的执行是在事务的上下文中进行的。
2. 场景
@Transactional注解在 Spring 框架中被广泛用于需要事务管理的业务场景。以下是一些常见的业务场景,其中@Transactional注解的使用是非常合适的:
- 数据一致性保证:
- 在涉及多个数据库操作,需要保证这些操作要么全部成功,要么全部失败的场景中,使用
@Transactional可以确保数据的一致性。
- 在涉及多个数据库操作,需要保证这些操作要么全部成功,要么全部失败的场景中,使用
- 并发事务处理:
- 当多个用户或服务同时对同一数据进行操作时,使用
@Transactional可以防止数据竞争条件和不一致性。
- 当多个用户或服务同时对同一数据进行操作时,使用
- 资金交易:
- 在电子商务或金融应用中,资金转账、支付处理等场景需要精确的事务控制,以确保资金的正确流动。
- 库存管理:
- 在订单处理系统中,库存的增减需要在事务控制下进行,以避免超卖或库存不一致的问题。
- 用户注册和登录:
- 用户注册时创建用户记录和相关配置信息,或者登录时更新用户状态,这些操作需要在事务控制下确保数据的一致性。
- 数据批量处理:
- 在处理批量数据导入或导出时,需要确保所有数据项都成功处理,或者在遇到错误时回滚,以保持数据的完整性。
- 复合操作:
- 当需要执行一系列复合操作,如更新多个相关联的表或记录时,使用
@Transactional可以确保这些操作作为一个整体被处理。
- 当需要执行一系列复合操作,如更新多个相关联的表或记录时,使用
- 错误恢复:
- 在业务操作中,如果遇到异常需要回滚到操作前的状态,
@Transactional可以自动处理这种回滚。
- 在业务操作中,如果遇到异常需要回滚到操作前的状态,
- 缓存与数据库同步:
- 当更新数据库的同时需要更新缓存,以保持缓存数据的一致性,
@Transactional可以确保数据库和缓存的更新操作要么同时成功,要么同时失败。
- 当更新数据库的同时需要更新缓存,以保持缓存数据的一致性,
- 分布式事务:
- 在微服务架构中,跨服务的数据操作可能需要分布式事务来保证数据的一致性。
- 异步消息处理:
- 在处理消息队列中的消息时,可能需要确保消息的发送和数据库操作的一致性。
- 服务层方法:
- 在服务层封装业务逻辑时,如果业务逻辑涉及到多个数据访问操作,使用
@Transactional可以简化事务管理。
- 在服务层封装业务逻辑时,如果业务逻辑涉及到多个数据访问操作,使用
- 补偿事务:
- 在需要执行补偿操作的场景中,如果一个操作失败,需要执行另一个操作来补偿,
@Transactional可以确保这两个操作的一致性。
- 在需要执行补偿操作的场景中,如果一个操作失败,需要执行另一个操作来补偿,
3. 源码
/*** @author Colin Sampaleanu* @author Juergen Hoeller* @author Sam Brannen* @author Mark Paluch* @since 1.2* @see org.springframework.transaction.interceptor.TransactionAttribute* @see org.springframework.transaction.interceptor.DefaultTransactionAttribute* @see org.springframework.transaction.interceptor.RuleBasedTransactionAttribute*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Reflective
public @interface Transactional {// String类型,用以指定事务管理器的唯一标识@AliasFor("transactionManager")String value() default "";/*** @since 4.2*/// 用以指定事务管理器的唯一标识@AliasFor("value")String transactionManager() default "";/*** @since 5.3*/// 设置属性的标签String[] label() default {};// Propagation枚举类型的属性,指定事务的隔离级别Propagation propagation() default Propagation.REQUIRED;// isolation枚举类型的属性,指定事务隔离的级别,Isolation isolation() default Isolation.DEFAULT;// timeout指定事务的超时时间,单位为秒,当事务执行时间超过timeout秒时,就会触发超时回滚操作,并释放事务占用的资源int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;/*** @since 5.3*/// 以String类型设置超时时间,单位为秒String timeoutString() default "";// 指定是否为只读事务// ture:只读// false:非只读boolean readOnly() default false;// 指定异常类的Class对象,当抛出指定类型异常或者其子类型的异常时,事务会自动回滚Class<? extends Throwable>[] rollbackFor() default {};// 指定异常类的全类名,当抛出指定全类名的异常或者其子类型的异常时,事务自动回滚String[] rollbackForClassName() default {};// 指定异常类的class对象,当抛出指定类型的异常或者其子类型的异常时,事务不会自动回滚Class<? extends Throwable>[] noRollbackFor() default {};// 指定异常类的全类名,当抛出指定全类名的异常或者其子类型的异常时,事务不会自动回滚String[] noRollbackForClassName() default {};
}
4. Demo
- 不同传播行为
@Transactional(propagation = Propagation.REQUIRED)
public void updateProductStock(Long productId, int quantity) {// 业务逻辑:更新产品库存
}
- 不同隔离级别
@Transactional(isolation = Isolation.READ_COMMITTED)
public void processOrder(Long orderId) {// 以 READ_COMMITTED 隔离级别执行的业务逻辑
}
- 超时时间
@Transactional(timeout = 5) // 超时时间设置为5秒
public void longRunningProcess() {// 长时间运行的业务逻辑
}
- 只读事务
@Transactional(readOnly = true)
public List<Product> getAllProducts() {// 只读事务,用于查询所有产品的列表
}
- 设置回滚异常
@Transactional(rollbackFor = Exception.class) // 默认所有异常都会触发回滚
public void processWithCustomRollback(Long productId) {// 如果抛出Exception类型的异常,事务将回滚
}@Transactional(noRollbackFor = ArithmeticException.class)
public void processWithNoRollback(Long productId) {// 如果抛出ArithmeticException类型的异常,事务不会回滚
}
- 组合应用
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE, timeout = 10, readOnly = false, rollbackFor = Exception.class)
public void complexBusinessProcess(Long productId, int quantity) {// 组合使用不同的@Transactional参数// 这个操作将在一个新的事务中执行,具有SERIALIZABLE隔离级别,超时时间为10秒,非只读事务,并且所有异常都会触发回滚
}
相关文章:
Spring学习笔记_29——@Transactional
Transactional 1. 介绍 Transactional 是 Spring 框架提供的一个注解,用于声明方法或类级别的事务属性。 Spring事务:Spring学习笔记_28——事务-CSDN博客 当你在一个方法或类上使用 Transactional 注解时,Spring 会为该方法或类创建一个…...
github使用基础
要通过终端绑定GitHub账号并进行文件传输,你需要使用Git和SSH密钥来实现安全连接和操作。以下是一个基本流程: 设置GitHub和SSH 检查Git安装 通过终端输入以下命令查看是否安装Git: bash 复制代码 git --version配置Git用户名和邮箱 bash …...
Flink-Kafka-Connector
Apache Flink 是一个用于处理无界和有界数据的开源流处理框架。它支持高吞吐量、低延迟以及精确一次的状态一致性等特性。Flink 社区提供了丰富的连接器(Connectors)以方便与不同的数据源进行交互,其中就包括了 Apache Kafka 连接器。 Apach…...
远程终端vim里使用系统剪切板
1、本地通过终端远程linux server,由于不是桌面环境/GUI,终端vim里似乎没办法直接使用系统剪切板,即便已经是clipboard。 $ vim --version | grep clipboard clipboard keymap printer vertsplit eval …...
底层视角看C语言
文章目录 main函数很普通main函数之前调用了什么main函数和自定义函数的对比 变量名只为人而存在goto是循环的本质指针变量指针是一个特殊的数字汇编层面看指针 数组和指针数组越界问题低端地址越界高端地址越界 引用就是指针 main函数很普通 main函数是第一个被调用的函数吗&…...
【点云学习笔记】——分割任务学习
3D点云实例分割 vs 3D点云语义分割 1. 功能对比 代码1(实例分割):用于3D点云中的实例分割任务,其目标是将点云中的物体分割成独立的实例。每个实例可能属于相同类别但需要被分开,比如在自动驾驶中的多个行人、汽车&am…...
Qt——窗口
一.窗口概述 Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow是一个为用户提供主窗口程序的类,继承QWidget类,并且提供一个预定义的布局。包含一个菜单栏(menu bar),多个工具栏(tool bars࿰…...
InfluxDB性能优化指南
1. 引言 1.1 InfluxDB的简介与发展背景 InfluxDB是一个开源的时间序列数据库(TSDB),由InfluxData公司开发,专门用于处理高频率的数据写入和查询。其设计初衷是为物联网、应用程序监控、DevOps和实时分析等场景提供一个高效的存储…...
负载均衡式在线oj项目开发文档2(个人项目)
judge模块的框架 完成了网页渲染的功能之后,就需要判断用户提交的代码是否是正确的,当用户点击提交之后,就会交给路由模块的/judge模块,然后这个路由模块就需要去调用jude模块了,也就是需要一个新的jude模块ÿ…...
ssm081高校实验室管理系统的设计与实现+vue(论文+源码)_kaic
毕 业 设 计(论 文) 题目:高校实验室管理系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很…...
GitLab基于Drone搭建持续集成(CI/CD)
本文介绍了如何为 Gitee 安装 Drone 服务器。服务器打包为在 DockerHub 上分发的最小 Docker 映像。 1. 准备工作 创建OAuth应用 创建 GitLab OAuth 应用。Consumer Key 和 Consumer Secret 用于授权访问极狐GitLab 资源。 ps:授权回调 URL 必须与以下格式和路径匹配&…...
用GPB外链打造长期稳定的SEO优势!
很多人在谈外链时,总喜欢纠结是追求数量还是追求质量。其实,最理想的策略是两者兼顾。而在这其中,GPB外链可以说是长期SEO提升的“法宝”。为什么这么说?因为GPB外链不仅保证了高质量,还附带了与网站主题高度相关的原创…...
第11章 内连接与外连接
一、介绍内连接与外连接 (1)内连接与外连接介绍 1、内连接:合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行。 2、外连接:: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(…...
C++ 游戏开发:打造高效、性能优越的游戏世界
在游戏开发领域,C 一直是最受欢迎的编程语言之一。其高效的内存管理和对硬件的底层控制,使得 C 成为开发高性能游戏的首选语言。从大型 3D 游戏引擎到独立游戏的制作,C 在游戏开发中发挥了不可替代的作用。 本文将带你了解 C 在游戏开发中的…...
太速科技-440-基于XCVU440的多核处理器多输入芯片验证板卡
基于XCVU440的多核处理器多输入芯片验证板卡 一、板卡概述 本板卡系我司自主研发的基于6U CPCI处理板,适用于多核处理器多输入芯片验证的应用。芯片采用工业级设计。 基于XCVU440T的多核处理器多输入芯片验证板卡基于6U CPCI架构,是单机中的一个…...
澳鹏通过高质量数据支持 Onfido 优化AI反欺诈功能
“Appen 在 Onfido 的发展中发挥了至关重要的作用,并已成为我们运营的重要组成部分。我们很高兴在 Appen 找到了可靠的合作伙伴。” – Onfido 数据和分析总监 Francois Jehl 简介:利用人工智能和机器学习增强欺诈检测 在当今日益数字化的世界ÿ…...
基于ECS实例搭建Hadoop环境
环境搭建: 【ECS生长万物之开源】基于ECS实例搭建Hadoop环境-阿里云开发者社区 搭建Hadoop环境_云服务器 ECS(ECS)-阿里云帮助中心 Hadoop入门基础(二):Hadoop集群安装与部署详解(超详细教程)࿰…...
关于vue如何监听route和state以及各自对应的实际场景
一、监听route 场景:监听浏览器地址栏分页参数的变化 // 注意 newPageNum和 oldPageNum是 string类型 $route.query.pageNum(newPageNum, oldPageNum) {if (newPageNum ! oldPageNum && newPageNum ! this.pageNum.toString()) {this.handleCurrentChange(p…...
【计网不挂科】计算机网络期末考试(综合)——【选择题&填空题&判断题&简述题】完整题库
前言 大家好吖,欢迎来到 YY 滴计算机网络 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的计算机网络题目,供yy应对期中考试复习。大家可以参考 欢迎订阅 YY滴其他专栏!…...
Linux(CentOS)设置防火墙开放8080端口,运行jar包,接收请求
1、查看防火墙状态 systemctl status firewalld 防火墙开启状态 2、运行 jar 包,使用8080端口 程序正常启动 3、使用 postman 发送请求,失败 4、检查端口是否开放(需更换到 root 用户) firewall-cmd --zonepublic --query-por…...
【低功耗蓝牙】④ 蓝牙MIDI协议:从ESP32 MicroPython代码到智能乐器DIY
1. 蓝牙MIDI协议入门:从音乐小白到智能乐器开发者 第一次听说蓝牙MIDI协议时,我正盯着桌上的ESP32开发板发呆。作为一个只会弹几个和弦的编程爱好者,完全没想到自己能用代码"演奏"音乐。蓝牙MIDI就像音乐世界的通用语言,…...
DeepSeek LeetCode 2421. 好路径的数目 Python3实现
给你 Python3 版本的代码,思路和之前的 Java 实现一致: 完整代码 python class Solution: def numberOfGoodPaths(self, vals: List[int], edges: List[List[int]]) -> int: n len(vals) # 1. 构建邻接表 gr…...
从开源AI导师项目GURU-Ai拆解:如何构建具备教学能力的智能体
1. 项目概述:一个“AI导师”的诞生与定位最近在GitHub上看到一个挺有意思的项目,叫“Guru322/GURU-Ai”。光看名字,你可能会觉得这又是一个平平无奇的AI工具仓库。但点进去细看,你会发现它的野心不小——它想做的不是又一个聊天机…...
全域态势数字孪生,筑牢楼宇长效安全透明防护屏障
全域态势数字孪生,筑牢楼宇长效安全透明防护屏障副标题:全要素三维动态实时复刻楼宇实景,依托无感全域人员感知、多机位跨镜联动追踪、身体指纹唯一身份归档,异常行为、区域滞留、安全隐患提前透明预警处置一、方案概述伴随城市高…...
Go语言缓存雪崩:防止缓存失效
Go语言缓存雪崩:防止缓存失效 1. 雪崩防护 type CacheWithProtection struct {cache *RedisCachemu sync.Mutexlocks map[string]*sync.Mutex }func NewCacheWithProtection(cache *RedisCache) *CacheWithProtection {return &CacheWithProtect…...
轻量级配置管理框架zcf:多环境配置、敏感信息加密与云原生集成实践
1. 项目概述:一个面向开发者的轻量级配置管理框架最近在梳理团队内部工具链时,发现一个挺普遍的问题:不同项目、不同环境(开发、测试、生产)的配置管理总是乱糟糟的。.env文件满天飞,敏感信息一不小心就提交…...
智能体开发实战:从框架选型到部署优化的完整指南
1. 项目概述:一个为智能体开发者准备的“军火库”如果你正在或打算踏入智能体(Agent)开发这个领域,那么你很可能已经体会过那种“万事开头难”的迷茫。从选择哪个框架开始,到如何设计一个有效的智能体工作流࿰…...
从零构建现代化工作流引擎:架构、实战与生产级部署指南
1. 项目概述:一个为专业开发者打造的现代化工作流引擎最近在GitHub上看到一个挺有意思的项目,叫rohitg00/pro-workflow。光看名字,你可能觉得这又是一个“工作流”工具,市面上这类工具已经多如牛毛了。但当我深入去研究它的源码、…...
无代码物联网实战:基于ESP32与WipperSnapper的泳池水温监测方案
1. 项目概述:告别繁琐编程,用无代码方案守护泳池水温又到了打理泳池的季节,除了常规的清洁和化学平衡,水温其实是个挺关键的指标。水温不仅影响游泳的舒适度,也关系到泳池加热设备的能耗和泳池化学品的反应速率。以前想…...
3个技巧让SD-PPP插件提升Photoshop设计效率300%
3个技巧让SD-PPP插件提升Photoshop设计效率300% 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 还在为Photoshop和AI工具之间的频繁切换而烦恼吗?每次都要导出PSD、上传到AI平台、等待生成、再导回Phot…...
