工作中遇到的问题,代码在测试环境执行正常,在线上报以下错误:
Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables
翻译后:语句违反GTID一致性:对非事务性表的更新只能在自动提交语句或单语句事务中进行,并且永远不能在对事务性表的更新的同一语句中进行。
分析原因:关键点语句【对非事务性表的更新】,翻看代码中加了事务注解 @Transactional,测试环境表的数据库引擎是InnoDB,是支持事务的,经执行代码也没问题,线上报此错误,猜想线上表的数据库引擎可能是不支持事务的,有可能是公司DB在建线上表的时候建错了。
由于我们是新上的功能,表中无数据,所以我是让管理员把错误的表删了,重新给了建表语句,将表引擎设置为 InnoDB ,再执行代码不报错了,问题得到了解决。