Spring @Transactional注解的使用注意事项
Spring @Transactional注解的使用注意事项
1.1、只能用在public方法
@Transactional注解只能用在public方法上,如果用在protected或private方法上,不会报错,但也不会回滚。
1.2、只能回滚非受检异常
Java异常分类如下:
-Throwable
--|Error
--|Exception
-----|IOException
-----|ClassNotFoundException
-----|CloneNotSupportedException
-----|RuntimeException
其中,Error和RuntimeException的子类是受检异常,当出现这些异常时@Transactional会进行回滚。但如果发生的是非受检异常,不会回滚。
1.3、指定回滚异常类型
如果需要在发生回滚非受检异常时进行回滚,可以指定回滚的异常类型,如下:
@Transactional(rollbackFor = Exception.class)
1.4、只能作用于被Spring管理的类上
@Transactional一般用在Service层,一般我们都会加上@Service注解,所以一般不会遇到这个问题。
1.5、被try...catch...处理的异常不会回滚
这其实是废话,因为try...catch处理了,就不会发生异常。
1.6、手动指定传播机制
Spring的事务有七种传播机制,如下:
PROPAGATION_REQUIRED | 支持当前事务,如果当前没有事务,则创建一个事务,这是最常见的选择。 |
---|---|
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务来执行 |
PROPAGATION_MANDATORY | 支持当前事务,如果没有当前事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务执行操作,如果当前存在事务,则当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED 类似的操作。 |
可以在@Transactional注解中手动指定:
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
参考:https://blog.csdn.net/qq_33036061/article/details/106801466
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY