mysql 禁止使用 on duplicate key update 吗

2020-05-04 16:05:54 +08:00
 meteor957

在定时任务中执行 on duplicate key update 产生死锁了,查了一些资料很多建议不使用这个语句,还不如先 select 出来再判断是 update 还是 insert 。

既然如此 这个语句还有啥用... 大佬们还有其它解决方案吗

3377 次点击
所在节点    程序员
11 条回复
angryfish
2020-05-04 17:03:42 +08:00
该死锁,update 的时候一样死锁
msg7086
2020-05-04 17:11:21 +08:00
有啥用?单线程的时候不就有用了吗。
meteor957
2020-05-04 17:41:43 +08:00
@msg7086 有道理
meteor957
2020-05-04 17:44:29 +08:00
@angryfish update 只加 X 锁也会出现这种情况吗,该如何避免呢
xhinliang
2020-05-04 18:02:44 +08:00
说下我的几个解决方案:
1. insert ignore,判断返回值,如果 affected row > 0 则手动 update
2. 隔离级别降低到 rc
meteor957
2020-05-04 18:21:42 +08:00
@xhinliang 感谢。暂时加了一个状态来判断定时器的 sql 是否执行完毕,避免并发去 update...
xhinliang
2020-05-04 20:25:11 +08:00
@angryfish 不是很懂你在说什么,我觉得 update 的时候不会死锁。
susecjh
2020-05-04 23:49:54 +08:00
是的,确实是会遇到这个问题的,写入量比较大并且还是并发是吧
gaius
2020-05-05 16:38:40 +08:00
两个事务获取锁顺序不同就有几率死锁,解决方法要么确保事务加锁顺序相同,不能确保可以回滚后重试
vison09
2020-12-12 10:57:07 +08:00
@angryfish 你错了,update 是不会死锁的,on duplicate key update 这个语句确实在某些场景是会产生死锁的
angryfish
2020-12-12 11:38:58 +08:00
@vison09 会死锁。你可以试试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/668462

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX