当前位置: 首页 > news >正文

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 框架提供的一个注解&#xff0c;用于声明方法或类级别的事务属性。 Spring事务&#xff1a;Spring学习笔记_28——事务-CSDN博客 当你在一个方法或类上使用 Transactional 注解时&#xff0c;Spring 会为该方法或类创建一个…...

github使用基础

要通过终端绑定GitHub账号并进行文件传输&#xff0c;你需要使用Git和SSH密钥来实现安全连接和操作。以下是一个基本流程&#xff1a; 设置GitHub和SSH 检查Git安装 通过终端输入以下命令查看是否安装Git&#xff1a; bash 复制代码 git --version配置Git用户名和邮箱 bash …...

Flink-Kafka-Connector

Apache Flink 是一个用于处理无界和有界数据的开源流处理框架。它支持高吞吐量、低延迟以及精确一次的状态一致性等特性。Flink 社区提供了丰富的连接器&#xff08;Connectors&#xff09;以方便与不同的数据源进行交互&#xff0c;其中就包括了 Apache Kafka 连接器。 Apach…...

远程终端vim里使用系统剪切板

1、本地通过终端远程linux server&#xff0c;由于不是桌面环境/GUI&#xff0c;终端vim里似乎没办法直接使用系统剪切板&#xff0c;即便已经是clipboard。 $ vim --version | grep clipboard clipboard keymap printer vertsplit eval …...

底层视角看C语言

文章目录 main函数很普通main函数之前调用了什么main函数和自定义函数的对比 变量名只为人而存在goto是循环的本质指针变量指针是一个特殊的数字汇编层面看指针 数组和指针数组越界问题低端地址越界高端地址越界 引用就是指针 main函数很普通 main函数是第一个被调用的函数吗&…...

【点云学习笔记】——分割任务学习

3D点云实例分割 vs 3D点云语义分割 1. 功能对比 代码1&#xff08;实例分割&#xff09;&#xff1a;用于3D点云中的实例分割任务&#xff0c;其目标是将点云中的物体分割成独立的实例。每个实例可能属于相同类别但需要被分开&#xff0c;比如在自动驾驶中的多个行人、汽车&am…...

Qt——窗口

一.窗口概述 Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;继承QWidget类&#xff0c;并且提供一个预定义的布局。包含一个菜单栏&#xff08;menu bar&#xff09;&#xff0c;多个工具栏&#xff08;tool bars&#xff0…...

InfluxDB性能优化指南

1. 引言 1.1 InfluxDB的简介与发展背景 InfluxDB是一个开源的时间序列数据库&#xff08;TSDB&#xff09;&#xff0c;由InfluxData公司开发&#xff0c;专门用于处理高频率的数据写入和查询。其设计初衷是为物联网、应用程序监控、DevOps和实时分析等场景提供一个高效的存储…...

负载均衡式在线oj项目开发文档2(个人项目)

judge模块的框架 完成了网页渲染的功能之后&#xff0c;就需要判断用户提交的代码是否是正确的&#xff0c;当用户点击提交之后&#xff0c;就会交给路由模块的/judge模块&#xff0c;然后这个路由模块就需要去调用jude模块了&#xff0c;也就是需要一个新的jude模块&#xff…...

ssm081高校实验室管理系统的设计与实现+vue(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;高校实验室管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很…...

GitLab基于Drone搭建持续集成(CI/CD)

本文介绍了如何为 Gitee 安装 Drone 服务器。服务器打包为在 DockerHub 上分发的最小 Docker 映像。 1. 准备工作 创建OAuth应用 创建 GitLab OAuth 应用。Consumer Key 和 Consumer Secret 用于授权访问极狐GitLab 资源。 ps:授权回调 URL 必须与以下格式和路径匹配&…...

用GPB外链打造长期稳定的SEO优势!

很多人在谈外链时&#xff0c;总喜欢纠结是追求数量还是追求质量。其实&#xff0c;最理想的策略是两者兼顾。而在这其中&#xff0c;GPB外链可以说是长期SEO提升的“法宝”。为什么这么说&#xff1f;因为GPB外链不仅保证了高质量&#xff0c;还附带了与网站主题高度相关的原创…...

第11章 内连接与外连接

一、介绍内连接与外连接 &#xff08;1&#xff09;内连接与外连接介绍 1、内连接&#xff1a;合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行。 2、外连接&#xff1a;: 两个表在连接过程中除了返回满足连接条件的行以外还返回左&#xff08…...

C++ 游戏开发:打造高效、性能优越的游戏世界

在游戏开发领域&#xff0c;C 一直是最受欢迎的编程语言之一。其高效的内存管理和对硬件的底层控制&#xff0c;使得 C 成为开发高性能游戏的首选语言。从大型 3D 游戏引擎到独立游戏的制作&#xff0c;C 在游戏开发中发挥了不可替代的作用。 本文将带你了解 C 在游戏开发中的…...

太速科技-440-基于XCVU440的多核处理器多输入芯片验证板卡

基于XCVU440的多核处理器多输入芯片验证板卡 一、板卡概述 本板卡系我司自主研发的基于6U CPCI处理板&#xff0c;适用于多核处理器多输入芯片验证的应用。芯片采用工业级设计。 基于XCVU440T的多核处理器多输入芯片验证板卡基于6U CPCI架构&#xff0c;是单机中的一个…...

澳鹏通过高质量数据支持 Onfido 优化AI反欺诈功能

“Appen 在 Onfido 的发展中发挥了至关重要的作用&#xff0c;并已成为我们运营的重要组成部分。我们很高兴在 Appen 找到了可靠的合作伙伴。” – Onfido 数据和分析总监 Francois Jehl 简介&#xff1a;利用人工智能和机器学习增强欺诈检测 在当今日益数字化的世界&#xff…...

基于ECS实例搭建Hadoop环境

环境搭建&#xff1a; 【ECS生长万物之开源】基于ECS实例搭建Hadoop环境-阿里云开发者社区 搭建Hadoop环境_云服务器 ECS(ECS)-阿里云帮助中心 Hadoop入门基础&#xff08;二&#xff09;&#xff1a;Hadoop集群安装与部署详解&#xff08;超详细教程&#xff09;&#xff0…...

关于vue如何监听route和state以及各自对应的实际场景

一、监听route 场景&#xff1a;监听浏览器地址栏分页参数的变化 // 注意 newPageNum和 oldPageNum是 string类型 $route.query.pageNum(newPageNum, oldPageNum) {if (newPageNum ! oldPageNum && newPageNum ! this.pageNum.toString()) {this.handleCurrentChange(p…...

【计网不挂科】计算机网络期末考试(综合)——【选择题&填空题&判断题&简述题】完整题库

前言 大家好吖&#xff0c;欢迎来到 YY 滴计算机网络 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本博客主要内容&#xff0c;收纳了一部门基本的计算机网络题目&#xff0c;供yy应对期中考试复习。大家可以参考 欢迎订阅 YY滴其他专栏&#xff01;…...

Linux(CentOS)设置防火墙开放8080端口,运行jar包,接收请求

1、查看防火墙状态 systemctl status firewalld 防火墙开启状态 2、运行 jar 包&#xff0c;使用8080端口 程序正常启动 3、使用 postman 发送请求&#xff0c;失败 4、检查端口是否开放&#xff08;需更换到 root 用户&#xff09; firewall-cmd --zonepublic --query-por…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...