项目中需要使用事务,配置完事务注解后,发现事务并没有预期的回滚,花费了不少时间才将问题解决。(T_T)
在配置文件中配置事务
在需要使用到的代码中,添加事务注解
结果发现并没有如预期一样进行回滚
之后去查了各种资料,总结了事务注解需要的注意事项
@Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。
另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰
除此之外,如果想在配置了事务注解的代码中,进行try…catch捕获,请在处理完相应逻辑后,将异常抛出,否则也是不会引起事务行为的。
当然,查找了一番后,发现自己的代码中事务处理方式并没有神马问题,于是打印mybaits输出,看看具体原因出在哪?
Mybaits如何在控制台输出:https://blog.csdn.net/scropio0zry/article/details/88010433
输出结果如下
可见事务确实开启了,并且也显示回滚了,但是数据库里的数据却还是被删除了
因此,继续查找原因,最终在https://blog.csdn.net/heqingsong1/article/details/8540665这篇文章中发现了原因。
如果用mysql数据库,数据库表你如果是自动建表,那么就需要把建表的Engine设置为InnoDB格式,自动建表的格式为:MyISAM,这中格式的是不支持事务管理的。
查了下需要事务处理的那张表,引擎格式确实是MyISAM
于是改成InnoDB,重新进行测试,成功解决问题。
事务注解说明比较详细的文章