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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你知道@Transactional注解的失效场景吗?相关的知识,希望对你有一定的参考价值。

参考技术A

在使用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引擎。

以上是关于你知道@Transactional注解的失效场景吗?的主要内容,如果未能解决你的问题,请参考以下文章

一口气说出 6种@Transactional注解的失效场景

一口气说出 6种,@Transactional注解的失效场景

你了解的Spring 的 @Transactional 注解控制事务,失效场景知多少?

事务注解 @Transactional 失效的3种场景及解决办法

@Transactional 失效场景

阿里一面:说一说事务注解 @Transactional 失效的几种场景及解决办法