MySQL 中的无死锁 MERGE 类似?

chx*_*chx 7 mysql deadlock

我正在尝试MERGE在 Drupal 中实现 MySQL 驱动程序的某些部分。当然,Drupal 有一些东西,但实际上它只是有效,因为最常见的 MERGE 发行者只是吃异常。

因此,无论我们尝试什么,都会发生死锁。我们做什么,我们开始一个事务,然后SELECT ... FOR UPDATE,尝试一个INSERT,如果它导致 23xxx 完整性错误,请尝试一个 UPDATE。死锁。我们删除了FOR UPDATE我们决定供我们使用的cos,没关系。依旧是僵局。

我不能只切换隔离级别,因为READ COMMITTED每个SET TRANSACTION 都需要行日志记录:

从 MySQL 5.1 开始,如果使用 READ COMMITTED [...],则必须使用基于行的二进制日志记录。

并且每个READ UNCOMMITTED也需要行日志记录。这里是二进制日志设置

要更改全局 binlog_format 值,您必须具有 SUPER 权限。对于 MySQL 5.1.29 的 session 值也是如此。

我不能要求每个 Drupal 设置都有SUPER,我们也不能说 Drupal 与基于语句的二进制日志不兼容,因为这是默认的和最普遍的。

INSERT ... ON DUPLICATE KEY既不够通用,也没有死锁

所以现在怎么办?

dab*_*st1 0

关于以下声明:

要更改全局 binlog_format 值,您必须具有 SUPER 权限。从 MySQL 5.1.29 开始,会话值也是如此。

您不需要向 Drupal 授予 SUPER 权限,因为上述语句仅适用于您想在运行时更改二进制日志格式的情况。

这是您需要做的:

您可以通过使用 --binlog-format=type 启动 MySQL 服务器来显式选择二进制日志记录格式。

您可以在 MySQL 手册中阅读有关设置二进制日志格式的更多信息。