V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
meteor957
V2EX  ›  程序员

mysql 禁止使用 on duplicate key update 吗

  •  
  •   meteor957 · 2020-05-04 16:05:54 +08:00 · 3354 次点击
    这是一个创建于 1667 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    11 条回复    2020-12-12 11:38:58 +08:00
    angryfish
        1
    angryfish  
       2020-05-04 17:03:42 +08:00 via iPhone
    该死锁,update 的时候一样死锁
    msg7086
        2
    msg7086  
       2020-05-04 17:11:21 +08:00
    有啥用?单线程的时候不就有用了吗。
    meteor957
        3
    meteor957  
    OP
       2020-05-04 17:41:43 +08:00
    @msg7086 有道理
    meteor957
        4
    meteor957  
    OP
       2020-05-04 17:44:29 +08:00
    @angryfish update 只加 X 锁也会出现这种情况吗,该如何避免呢
    xhinliang
        5
    xhinliang  
       2020-05-04 18:02:44 +08:00
    说下我的几个解决方案:
    1. insert ignore,判断返回值,如果 affected row > 0 则手动 update
    2. 隔离级别降低到 rc
    meteor957
        6
    meteor957  
    OP
       2020-05-04 18:21:42 +08:00
    @xhinliang 感谢。暂时加了一个状态来判断定时器的 sql 是否执行完毕,避免并发去 update...
    xhinliang
        7
    xhinliang  
       2020-05-04 20:25:11 +08:00
    @angryfish 不是很懂你在说什么,我觉得 update 的时候不会死锁。
    susecjh
        8
    susecjh  
       2020-05-04 23:49:54 +08:00 via Android
    是的,确实是会遇到这个问题的,写入量比较大并且还是并发是吧
    gaius
        9
    gaius  
       2020-05-05 16:38:40 +08:00 via Android
    两个事务获取锁顺序不同就有几率死锁,解决方法要么确保事务加锁顺序相同,不能确保可以回滚后重试
    vison09
        10
    vison09  
       2020-12-12 10:57:07 +08:00
    @angryfish 你错了,update 是不会死锁的,on duplicate key update 这个语句确实在某些场景是会产生死锁的
    angryfish
        11
    angryfish  
       2020-12-12 11:38:58 +08:00 via iPhone
    @vison09 会死锁。你可以试试。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5883 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:46 · PVG 09:46 · LAX 17:46 · JFK 20:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.