你知道@Transactional注解的失效场景吗?

 我来答
青柠姑娘17
2022-08-18 · TA获得超过1.2万个赞
知道大有可为答主
回答量:6754
采纳率:100%
帮助的人:39.1万
展开全部

在使用Spring的时候,进行事务管理变得相当简单:只要在方法上加上 @Transactional 就可以了,Spring就帮我们做了事务的开启、提交和回滚等操作,甚至我一度认为 @Transactional 就是等于Spring事务,只要是见到有数据库操作的方法,默认的统统加上此注解,自以为是的就万事大吉了。你是不是也有与我相同的经历呢:)

其实, @Transactional 也不是在任何的场景下都有效的,有时候会莫名的失效,在介绍之前呢,我们先来认识一下。

1、 @Transactional 注解可以用在哪些地方呢?

作用于类: 表示所有public方法都配置相同的事务信息。

作用于方法: 代表方法的事务信息,其会覆盖类的事务哦!

作用于接口: 这种方法极力不推荐,因为一旦使用cglib,注解会失效。

例如以下示例:

2、 @Transactional 注解还有哪些属性呢?

接下来,我们一起看看 @Transactional 失效的场景。

1、作用在非public方法上会失效

原因是 在使用Spring AOP 代理时,会间接调用AbstractFallbackTransactionAttributeSource的方法computeTransactionAttribute获取事务信息,如果是非public就直接返回了,如下源码:

2、 propagation属性配置错误

TransactionDefinition.PROPAGATION_SUPPORTS:有没有事务无所谓

TransactionDefinition.PROPAGATION_NOT_SUPPORTED:非事务方式执行

TransactionDefinition.PROPAGATION_NEVER:有事务抛异常

3、 rollbackFor设置错误

Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。若需要在特定异常下回滚,则需要指定,比如第一个示例。

4、在同一个类中,方法调用

这个尤其被大家不熟悉,红色标出。

原因是什么,大家可以想一想,我们下一章来分析:)

5、异常被catch给吃掉了

6、数据库底层不支持事务,比如mysql的 myisam引擎。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式