mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7mobile wallpaper 8mobile wallpaper 9mobile wallpaper 10mobile wallpaper 11mobile wallpaper 12
900 字
2 分钟
带你轻松学习并掌握@Transactional的高级用法!
2025-09-30

目录

一、传播行为

二、隔离级别

三、自定义回滚规则

四、超时

五、读写权限

六、避免类内部自调用事务失效


的 @Transactional 注解是实现声明式事务管理的核心,像我一样水平还不是很高的同学可能也只会使用其事务回滚功能,而对其扩展用法一无所知,那么在这篇文章我们就来了解一下@Transactional的高级用法吧。

一、传播行为#

传播行为类型说明适用场景
REQUIRED (默认)当前方法必须在事务中运行:加入已有事务或新建事务通用场景
REQUIRES_NEW挂起当前事务,始终启动独立新事务独立业务
NESTED在当前事务内创建嵌套事务可部分回滚的子操作
SUPPORTS有事务则加入,无事务则以非事务运行查询方法适应性兼容
MANDATORY必须在已有事务中运行,否则抛出异常强制要求事务上下文的场景
NOT_SUPPORTED挂起当前事务,以非事务方式运行强制非事务操作
NEVER必须在非事务环境下运行,否则抛出异常禁止事务的敏感操作
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void test() {
}

当我们直接使用 @Transactional的时候默认配置的就是REQUIRED。

这些型结合使用场景应该就能明白其作用,所以不做过多的说明了。

二、隔离级别#

这里的隔离级别指的就是的四种隔离级别:

  • READ_UNCOMMITTED
  • READ_COMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE

我们可以手动更改注解作用域下的隔离级别:

@Transactional(isolation = Isolation.SERIALIZABLE)
public void test() {
}

比如说当前方法我完全不怕脏读、幻读和不可重复读,那我大可改成READ_UNCOMMITTED级别来提升并发性能,可谓非常灵活了。

三、自定义回滚规则#

可以配置其在抛出指定异常时才会触发回滚操作或者才不会触发回滚操作。

@Transactional(
// 指定回滚的异常
rollbackFor = { BusinessException.class },
// 指定不回滚的异常
noRollbackFor = { ValidationException.class }
)
public void test() throws BusinessException {
}

四、超时#

可以配置注释作用域的执行最大时间,如果超时则会强制回滚,单位为秒。

@Transactional(timeout = 5)
public void test() {
}

五、读写权限#

可以指定当前事务的权限为只读或者只写。

@Transactional(readOnly = true)
public void test() {
}

但至于是否强制生效则取决于当前使用的栈,比如说我们最常用的Spring JDBC或Mybatis连接MySQL时,进行写操作时就会抛出异常终止程序向下运行。

那有同学可能有疑问纯读为何还需要添加事务?实际上确实没有必要添加事务,但是由于Spring对于只读事务是由效率优化的,可以加快响应速度,所以还是推荐加上事务并标注。

六、避免类内部自调用事务失效#

@Service
public class TestServiceImpl {
@Lazy
@Autowired
private TestServiceImpl testService;
public void test1() {
testService.test2()
}
@Transactional
public void test2() {
}
}

@Transactional只会在代理对象调用时生效,但如果我们在类内部调用带有此注解的方法的时候,是直接对象进行调用,所以该事务会失效。

为这个问题,我们一般会主动注入类本身,因为注入的Bean都是代理对象,然后用这个代理对象调用的话事务就会生效,但这样就会造成依赖循环,所以我们加上了@Lazy进行懒加载。


码文不易,留个赞再走吧


原文链接: 带你轻松学习并掌握@Transactional的高级用法! 作者: Yilena

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

带你轻松学习并掌握@Transactional的高级用法!
https://blog.csdn.net/2401_88959292/article/details/150223993?spm=1001.2014.3001.5501
作者
Yilena
发布于
2025-09-30
许可协议
CC BY 4.0

部分信息可能已经过时

相关文章 智能推荐
1
带你轻松学习Golang的并发模型
技术笔记 本文深度对比了Go与Java的并发模型,揭示了两者在应对大规模并发时的不同设计哲学。文章详细剖析了Go基于goroutine与channel的轻量级G-P-M调度机制,强调其“通过通信共享内存”的理念;同时回顾了Java基于操作系统线程与共享内存加锁的传统模型,及引入虚拟线程后的演进。通过具体的超时与取消场景代码对比,探讨了两者在控制流、资源认知及场景亲和性上的差异,帮助开发者在不同业务上下文中做出更明智的并发架构选择。
2
带你轻松学习LangChain4j
技术笔记 本文全面介绍了Java生态中的大模型应用开发框架LangChain4j。从其解决的模型调用统一化、Prompt管理规范化等核心痛点出发,详细解析了框架的四层架构与面向抽象、消息优先的设计思想。文章深入讲解了ChatLanguageModel、AiServices等核心模块,剖析了@SystemMessage、@UserMessage等常用注解的驱动机制,并探讨了ChatMemory上下文管理、流式输出及结构化结果解析等高级特性。最后,客观分析了LangChain4j在企业级开发中的优势与当前版本的局限性。
3
带你轻松学习Caffeine
技术笔记 本文全面介绍了高性能Java本地缓存库Caffeine。从其定位与核心概念(如命中率、淘汰策略、过期与刷新机制)出发,详细对比了本地缓存与分布式缓存的差异。文章深入讲解了Cache、LoadingCache及AsyncLoadingCache的构建与配置,分享了批量缓存加载技巧,并剖析了基于大小与权重的淘汰策略及冷启动预热方案。最后,针对缓存雪崩、击穿、穿透、一致性及OOM风险等常见问题,提供了实用的应对策略,帮助开发者在并发场景下高效、安全地使用Caffeine。
4
带你轻松学习JUC
技术笔记 本文系统讲解了Java并发编程核心工具包JUC。从线程基础、状态转换及活跃性问题(死锁、活锁、饥饿)入手,深入剖析了线程安全判断、逃逸分析及AQS底层原理。详细对比了synchronized的锁升级机制与ReentrantLock的核心特性,解析了volatile的可见性与Happens-Before规则。此外,还全面介绍了CAS机制、各类原子类、并发同步器(CountDownLatch等)、线程池原理及多种线程安全集合,为开发者构建了完整的Java高并发知识体系。
5
带你轻松学习MyBatis
技术笔记 本文系统讲解了半自动持久层框架MyBatis及其增强工具MyBatis-Plus的核心知识。从ORM思想出发,详细解析了SqlSession工厂模式、Mapper接口与XML映射基础,对比了#{}与${}的安全性差异。深入探讨了XML与注解方式的动态SQL实现,以及MyBatis的一级、二级缓存机制与一致性问题。此外,全面介绍了MyBatis-Plus带来的ActiveRecord模式、自动CRUD、乐观锁、逻辑删除、元对象自动填充及内置分页等高效增强功能,助力开发者提升数据库操作效率。

目录

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00