我有一个中等容量的应用程序,每秒执行大约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字段上进行“安全更新”(?)?还是我需要编写update
以便删除fts
字段并将它们分别排队(这似乎很麻烦)。解决这个问题的最佳方法是什么?
((看到SELECT
等后,我可能会得到一个更好的答案,但这是开始建议。)
每当可能出现死锁时,都应在代码中提供从死锁中恢复的能力。也就是说,在执行UPDATE
之后检查死锁,然后重新执行一次更新。