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事务失效的原因有以下几种:
-
如使用mysql且引擎是MyISAM,则事务会不起作用,原因是MyISAM不支持事务,可以改成InnoDB
-
如果使用了spring+mvc,则
context:component-scan
重复扫描问题可能会引起事务失败。 -
@Transactional
注解开启配置,必须放到listener
里加载,如果放到DispatcherServlet
的配置里,事务也是不起作用的。 -
@
Transactional
注解只能应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,事务也会失效。 -
Spring团队建议在具体的类(或类的方法)上使用 @
Transactional
注解,而不要使用在类所要实现的任何接口上。在接口上使用 @Transactional
注解,**只能当你设置了基于接口的代理时它才生效。**因为注解是 不能继承 的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。
当事务失效时,可以逐一排查问题所在,如果有问题不在以上中的,欢迎评论补充!