Spring学习笔记_29——@Transactional

devtools/2024/11/15 0:43:16/

@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秒,非只读事务,并且所有异常都会触发回滚
}


http://www.ppmy.cn/devtools/132601.html

相关文章

从无音响Windows 端到 有音响macOS 端实时音频传输播放

以下是从 Windows 端到 macOS 端传输音频的优化方案&#xff0c;基于上述链接中的思路进行调整&#xff1a; Windows 端操作 安装必要软件 安装 Python&#xff08;确保版本兼容且已正确配置环境变量&#xff09;。安装 PyAudio 库&#xff0c;可通过 pip install pyaudio 命令…

【Linux系统】—— 基本指令(二)

【Linux系统】—— 基本指令&#xff08;二&#xff09; 1 「alias」命令1.1 「ll」命令1.2 「alias」命令 2 「rmdir」指令与「rm」指令2.1 「rmdir」2.2 「rm」2.2.1 「rm」 删除普通文件2.2.2 「rm」 删除目录2.2.3 『 * 』 通配符 3 「man」 指令4 「cp」 指令4.1 拷贝普通…

青少年编程与数学 02-003 Go语言网络编程 19课题、Go语言Restful编程

青少年编程与数学 02-003 Go语言网络编程 19课题、Go语言Restful编程 课题摘要:一、微服务微服务的主要特点包括&#xff1a;微服务架构的挑战&#xff1a;微服务的应用场景&#xff1a; 二、RESTfulRESTful的核心原则和特征包括&#xff1a;RESTful API的优势&#xff1a;REST…

我的博客网站为什么又回归Blazor了

引言 在博客网站的开发征程中&#xff0c;站长可谓是一路披荆斩棘。从最初的构思到实践&#xff0c;先后涉足了多种开发技术&#xff0c;包括 MVC、Razor Pages、Vue、Go、Blazor 等。在这漫长的过程中&#xff0c;网站版本更迭近 10 次&#xff0c;每一个版本都凝聚着站长的心…

241105_Pycharm切换jupyter环境(jupyter报缺失包)

241105_Pycharm切换jupyter环境&#xff08;jupyter报缺失包&#xff09; 使用jupyter notebook进行代码学习往往是一种效率很高的方法&#xff0c;我们可以随时查看变量的内容。 在使用conda管理虚拟环境时&#xff0c;往往我们在终端新建好虚拟环境并安装好所需要的包之后&…

Kotlin-面向对象之构造函数、实例化和初始化

构造函数 主构造函数&#xff1a; 主构造函数直接在class头部用小括号定义 class Player(_name:String, _healthPoints:Int, _isBlessed:Boolean, _isImmortal:Booleanfalse) {} 变量下划线前缀用来表示临时变量 主构造函数支持直接定义属性 class Player(name:String, v…

【java】内存图练习

java数据类型主要分为两大类 1. 基本类型&#xff08;primitive type&#xff09;2.引用类型&#xff08;reference type&#xff09; 1. 基本类型 (8种) 分为 1 数值类型 &#xff1a; 整数类型 byte, short, int, long --- 不初始化&#xff0c;默认为 0 浮点类型 &am…

基于vue框架的的热点推荐个性化新闻系统的设计与实现ka0x6(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,新闻类型,省份,时事新闻,视频新闻 开题报告内容 基于Vue框架的热点推荐个性化新闻系统的设计与实现开题报告 一、项目背景 随着互联网技术的飞速发展和信息量的爆炸式增长&#xff0c;新闻资讯已成为人们日常生活中不可或缺的一…