InnoDB 全文搜索死锁

InnoDB full-text-search deadlock

我有一个中等容量的应用程序,每秒执行大约 40 次插入。所有插入的格式为:

UPDATE item SET values=... WHERE row_id='18273-3749d-8743'

此外,任何项目都不会同时更新多次。这看起来很简单,如果我们忽略其他一切,就不应该出现死锁。但是,我有一个 fulltext 字段似乎获得了伪 table 级锁,而不是行级锁,如果我对此进行了正确的故障排除。这是它在 SHOW ENGINE INNODB STATUS:

上给出的错误
LATEST DEADLOCK DETECTED
...
RECORD LOCKS space ... index FTS_DOC_ID_INDEX of table

因此,如果我对此的解释正确,似乎 FTS_DOC_ID_INDEX 正在执行某种 "more-than-row-level-lock" 更新搜索索引。这是正在发生的事情吗?如果是这样,处理这个问题的正确方法是什么——例如,我不能减少对应用程序的写入次数,有没有办法在 FTS 字段上执行 "safe update" (?)?或者我是否需要编写 updates 以便我删除 fts 字段并将它们分开排队(这看起来很痛苦)。处理此问题的最佳方法是什么?

(在看到 SELECT 等之后,我可能会有更好的答案,但这里是开始的建议。)

每当您可能遇到死锁时,您应该在代码中提供从死锁中恢复的功能。即UPDATE后检查死锁,然后重新执行一次更新