Error number: 3571; Symbol: ER_BINLOG_UNSAFE_NOWAIT; SQLSTATE: HY000
Message: Statement is unsafe because it uses NOWAIT. Whether the command will succeed or fail is not deterministic.
Error number: 3571; Symbol: ER_BINLOG_UNSAFE_NOWAIT; SQLSTATE: HY000
错误说明
ER_BINLOG_UNSAFE_NOWAIT 指的是该操作不支持NO WAIT选项。它是一个 MySQl 关键字,发出时一般会报一个性能错误,其中包括常见的错误码3571。该错误指的是MySQL无法为事务做到强一致性(STRONG consistency),因此无法满足参数 NO WAIT 的要求,于是产生此错误。
常见案例
通常在使用 MySQL 开发应用时,程序会根据不同情况来决定该如何执行事务。通常会在发出 COMMIT 命令之前使用 NO WAIT ,以提高程序的性能。但是,这种方法可能会导致 ER_BINLOG_UNSAFE_NOWAIT。
比如,有很多程序在发出 COMMIT 之前,会使用一个叫 SHOW BINLOGS 的查询,这样可以获取当前处理的日志情况,检查binlog 是否已经被更新了。但是,这样做很可能会引发 ER_BINLOG_UNSAFE_NOWAIT 错误,因为 SHOW BINLOGS 查询可能不会根据 before_commit 规则不做任何事。
解决方法
1. 禁用NO WAIT。
该方法最实用,针对当前程序最可能出现ER_BINLOG_UNSAFE_NOWAIT错误时,可以尝试禁用NO WAIT,使应用可以正确运行。
2. 调整模式
也可以考虑调整模式,将“before_commit”的模式设置为“after_commit”。这会改变MySQL 数据库的 transactional 特性,以达到更高的性能,但可能会丢失一些事务特性。
3. 调整代码
如果既不想禁用NO WAIT,也不想修改模式,既可以考虑调整代码来解决这个问题。
可以在代码中加入以延迟 COMMIT 操作,或者修改 COMMIT 语句,使它在处理 SHOW BINLOGS 查询结果之后执行。
总的来说,ER_BINLOG_UNSAFE_NOWAIT 错误是由于 MySQL 无法为事务做到强一致性,并且无法满足参数 NO WAIT 的要求而导致的,可以通过禁用 NO WAIT 来解决,也可以通过调整模式或调整代码来解决。