注意:本事务失效是Seata的分布式事务控制已经有作用的情况下,远程事务能回滚,但是本地事务不能回滚的情况。
1、问题描述
使用seata做了分布式事务控制,在本地事务A上添加了全局事务注解,在手动制造异常进行测试时,远程的两个分支事务能正常回滚,但是本地事务没有正常回滚。
2、问题查找
在异常之前打了断点,然后在没有执行回滚之前查看数据库中的undo-log表的事务回滚的前置镜像数据,发现在回滚的条目字段中的一个tinyint类型的值有问题,本来存的是1,但是前置镜像中自动映射的却是true(mysql数据库的tinyint可以映射为boolea类型)。
于是我就将该字段类型改为int,再次测试,发现问题消失。难道seata进行事务控制时不能使用tinyint类型吗?肯定不会。于是我再次把字段类型改为tinyint,然后长度设置为2(原本长度为1),再次测试,问题没有发生,事务正常回滚,查看前置镜像,数据也正常存储为1并不是映射为true,不信邪的我再次将字段设置为tinyint长度为1,再次测试,问题又出现了,本来值为1但是在前置镜像中值就变成了true,疯了。
3、问题总结
最后也没有找出问题的原因,只能不优雅的将字段设置为tinyint长度为2来解决问题,也许是我的seata配置有问题,如果有大佬知道是什么原因造成的,希望能指点一下。谢谢。