【问题标题】:InnoDB full-text-search deadlockInnoDB 全文搜索死锁
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 能否请您在代码/SQL 中展示如何执行此操作的示例,我可以奖励赏金?
  • @samuelbrody1249 - 您的应用程序语言是什么? (代码会有所不同。)UPDATE 是较长事务的一部分,还是以 autocommit=ON 运行。
  • 或多或少自动提交。我愿意:cursor.execute('...'); conn.commit('...') 在 python 中。所以一个语句然后我运行提交。
  • 嗯...没什么明显的。所以我唯一的建议是添加代码从死锁中恢复。您还可以设计一个小型、可重复的测试用例,并在 bugs.mysql.com 提交错误报告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多