MySQL Error number: 3571; Symbol: ER_BINLOG_UNSAFE_NOWAIT; SQLSTATE: HY000

文档解释

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 来解决,也可以通过调整模式或调整代码来解决。

你可能感兴趣的