SpringBoot 快速开启事务中 @Transaction注解不生效的问题

本文解析了Spring事务管理中常见的三大问题:非检测异常下事务不开启、业务层捕捉异常后事务失效及注解可见度不当导致事务不生效。探讨了如何正确配置@Transactional注解以确保事务正常回滚,并提供了最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见1:遇到非检测异常时,事务不开启,也无法回滚。

原因:因为Spring的默认的事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会回滚。如果想针对非检测异常进行事务回滚,可以在@Transactional 注解里使用rollbackFor 属性明确指定异常。

 

常见2: 在业务层捕捉异常后,发现事务不生效。

原因:在业务层手工捕捉并处理了异常(try..catch)等于把异常“吃”掉了,Spring自然不知道这里有错,更不会主动去回滚数据。推荐做法是在业务层统一抛出异常,然后在控制层统一处理。

 

常见 3 :注解到protected可见度的方法上,事务不生效

原因:@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

 

Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因 此请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

 

参考连接

http://stackoverflow.com/questions/15616710/spring-transactional-with-aspectj-is-totally-ignored

http://www.iflym.com/index.php/code/the-theory-about-spring-and-aspectj-pre.html

 

 

 

 


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值