> 文档中心 > Spring事务失效的几种原因

Spring事务失效的几种原因

Spring事务失效的几种原因

我们在spring项目中,使用事务时,一般会在接口上,直接加@Transactional注解。例如:

@Transactionalpublic Employee addEmployee() throws Exception {    Employee employee = new Employee("3y", 23);    employeeRepository.save(employee);// 假设这里出了Exception    int i = 1 / 0;    return employee;}

但有时候事务也有可能会失效。

一般来说,spring事务失效的原因有以下几种:

  1. 如使用mysql且引擎是MyISAM,则事务会不起作用,原因是MyISAM不支持事务,可以改成InnoDB

  2. 如果使用了spring+mvc,则context:component-scan重复扫描问题可能会引起事务失败。

  3. @Transactional 注解开启配置,必须放到listener里加载,如果放到DispatcherServlet的配置里,事务也是不起作用的。

  4. @Transactional 注解只能应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,事务也会失效。

  5. Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。在接口上使用 @Transactional 注解,**只能当你设置了基于接口的代理时它才生效。**因为注解是 不能继承 的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。

当事务失效时,可以逐一排查问题所在,如果有问题不在以上中的,欢迎评论补充!