【发布时间】:2020-05-23 00:28:21
【问题描述】:
我有一个中等容量的应用程序,每秒执行大约 40 次插入。所有插入的格式为:
UPDATE item SET values=... WHERE row_id='18273-3749d-8743'
此外,没有项目会同时更新多次。这似乎很简单,如果我们忽略其他一切,就不应该出现僵局。但是,如果我正确排除了此问题,我有一个 fulltext 字段似乎获得了伪表级锁,而不是行级锁。这是它在SHOW ENGINE INNODB STATUS 上给出的错误:
LATEST DEADLOCK DETECTED
...
RECORD LOCKS space ... index FTS_DOC_ID_INDEX of table
因此,如果我对此的解释正确,似乎 FTS_DOC_ID_INDEX 正在执行某种“多于行级锁定”来更新搜索索引。这是正在发生的事情吗?如果是这样,处理这个问题的正确方法是什么——例如,我不能减少对应用程序的写入次数,有没有办法在 FTS 字段上进行“安全更新”(?)?或者我是否需要编写updates 以便我删除fts 字段并将它们单独排队(这似乎是一个巨大的痛苦)。处理这个问题的最佳方法是什么?
【问题讨论】:
-
请向我们展示 STATUS 的“死锁”部分的完整文本,以及冲突的 SELECT。
-
如果你要 SET GLOBAL innodb_print_all_deadlocks=1;系统会将遇到的每个死锁记录在错误日志中。要停止记录死锁,请设置 GLOBAL innodb_print_all_deadlocks=0; 2个小时后。请发布您最近 2 小时的错误日志,以便我们查看原因。
标签: mysql full-text-search innodb