用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景?
不知道小伙伴们有没有这样的经历,在自己开心的编写业务代码时候,突然某一个方法里的事务好像失效了。然后 debug 跟踪代码时发现,自己第一步的 insert 或者 update 的数据在语句执行完毕后,数据库中并没有立即出现更改或保存完的新数据。
所以一度怀疑spring 的事务失效了。那么这篇文章就来总结一下,大家给大家造成 “spring事务失效”错觉的 几个常见场景,然后对症下药。
Let's GO!!!
以本人的经历中遇到的问题,大概分有以下几个场景:
-
数据库引擎是否支持事务(Mysql 的 MyIsam引擎不支持事务);
-
注解所在的类是否被加载为 Bean(是否被spring 管理);
-
注解所在的方法是否为 public 修饰的;
-
是否存在自身调用的问题;
-
所用数据源是否加载了事务管理器;
-
@Transactional的扩展配置propagation是否正确。
下面展开分析每一个场景:
数据库引擎不支持事务