mybaits事务不回滚原因分析

项目中需要使用事务,配置完事务注解后,发现事务并没有预期的回滚,花费了不少时间才将问题解决。(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,重新进行测试,成功解决问题。

 

事务注解说明比较详细的文章

https://www.jianshu.com/p/5687e2a38fbc

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值