原始issue 是这个:
Deadlock · Issue #662 · didi/KnowStreaming · GitHub
替换replace 为 insert into ... on duplicate key update
https://github.com/didi/KnowStreaming/pull/684/files
但是仍然没有解决
后又复现:
mysql死锁报错 · Issue #728 · didi/KnowStreaming · GitHub
解决方案:
详细讨论参考 https://github.com/didi/KnowStreaming/pull/751
这块解决的思路是:在代码中,查询已有的数据。如果数据已存在,就执行updateById的操作,如果不存在,就执行insert的操作。insert操作时,忽略key冲突的异常。
这样做的原因是:整体代码实现逻辑上比较简单,没有引入一些复杂的东西。缺点是会损耗一些性能,但是也有一定的优化空间,比如如果发现数据没有变化,可以直接不进行updateById。
主要原因是调度任务并行执行,更新数据的时候存在更新相同行的数据引起的死锁。