你的位置:首页 > Java教程

[Java教程]Mysql引起的spring事务失效


老项目加新功能,导致出现service调用service的情况..一共2张表有数据的添加删除.然后测试了一下事务,表A和表B,我在表B中抛了异常,但结果发现,表B回滚正常,但是表A并没有回滚.显示事务失效.

比较巧的是表A和表B是在不同的service中,所以最开始想到的是多service导致的,但是查看了事务的定义后发现,事务的传播被设置成required,所以按理说所有service会处在一个事务中.经过痛苦的各种折腾各种尝试未果后,无意中发现每次都是表A事务无法回滚,这就有点奇怪了,这明显就是操作表A的事务失效了.其实这里我已经非常接近真正的原因了,只不过我依然认为可能是自己的错误配置导致操作表A的service事务失效,又是一阵折腾,实在看不出来有什么错误的地方,有点无奈.

没有什么思路,只好百度一下都有什么原因能导致事务失败,看了一堆帖子,无意中看到一个情况,mysql引擎导致的事务失效,瞬间一下都明白了..

找到表A的定义语句末尾能看到如下:

ENGINE=MyISAM AUTO_INCREMENT=40 DEFAULT CHARSET=gbk

稍微百度一下就能知道,mysql的MyISAM引擎是不支持事务的,所以想要支持事务,必须选择InnoDB引擎,将表A的mysql引擎改成InnoDB后,一切恢复正常.

感想:事务失效第一印象一定是各种配置或是代码的错误,但是看似无害的数据库可能才是隐藏在背后的罪魁祸首..