Spring事务失效的原因

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异常类及其子类。

总结:这几种事务失效的场景 ,发生最多的是自身调用、异常被吃、异常抛出类型错误这三个。

Spring事务失效的原因Spring事务失效的原因 xingze0516 发布了173 篇原创文章 · 获赞 10 · 访问量 8525 私信 关注
上一篇:Spring事务(@Transactional)各个属性介绍


下一篇:SpringBoot事务简单操作及手动回滚