Spring的@Transactional
注解控制事务有些情况下会有不生效的情况:
- 数据库引擎不支持事务;
- Bean没有被Spring管理;
- 方法不是public的;
- 数据源没有配置事务管理器;
- 自身调用问题;
- 异常被吃了;
- 异常类型错误。
数据库引擎不支持事务
以MySQL为例,其MyISAM引擎是不支持事务操作的,InnoDB才是支持事务的引擎,一般要支持事务都会使用InnoDB。
注:从MySQL 5.5.5 开始的默认存储引擎是InnoDB,之前默认的都是MyISAM。
Bean没有被Spring管理
//@Service
public class UserServiceImpl implements UserService{
@Transactional
public void sayHello(){
//......
}
}
如果把@Service
注解注释掉,这个类就不会被加载成一个Bean,那么这个类就不会被Spring管理了,事务自然就失效了。
方法不是public的
@Transactional
只能用于public的方法上,否则事务不会失效,如果要用在非public方法上,可以开启AspectJ代理模式。
数据源没有配置事务管理器
如果当前数据源没有配置事务管理器,那么事务就会失效。
自身调用问题
异常被吃了
@Transactional
public void sayHello(){
try {
//......
}catch{
}
}
异常类型错误
@Transactional
public void sayHello(){
try {
//......
}catch{
throw new Exception("发生错误");
}
}
这样事务也是不生效的,因为默认回滚的是RuntimeException,如果想触发其他类型的异常,需要在注解上配置一下。如:@Transactional(rollbackFor = Exception.class)
这个配置仅限于Throwable异常类及其子类。
总结:这几种事务失效的场景 ,发生最多的是自身调用、异常被吃、异常抛出类型错误这三个。
xingze0516 发布了173 篇原创文章 · 获赞 10 · 访问量 8525 私信 关注