• 数据库update死锁


    比较常见的死锁场景,并发批量update时的一个场景:
    update cross_marketing
    set gmtModified = NOW(),
    pageview = pageview+ #extpageview#
    WHERE marketingId=#marketingId#
    第一次调用时,marketingId传入值顺序: 1,3,5,12
    第二次调用时,marketingId传入值顺序:1,2,5,3
     
    每次update时,会锁行。(一次批量操作为一个事务)
    那么第一次调用时,顺序锁行,当更新完3,准备更新5的时候,发现5已经被第二次调用锁行了,就等待。而此时的第二次调用刚好更新完5准备去拿3的锁,却发现被第一次调用占有,于是就出现死锁。
     
    所以,我们要在批量更新,更新操作的时候,按照一个固定的顺序来排序,然后进行操作。
    前面的例子,如果按照marketingId从小到大排序,就会变成:
    第一次调用时,marketingId传入值顺序: 1,3,5,12
    第二次调用时,marketingId传入值顺序:1,2,3,5
    如此,就避免了死锁的发生。
  • 相关阅读:
    javascript Date.prototype
    Mac 安装node.js
    element-ui适配pad 遇到的问题
    GCD实现异步任务同步的两种方式
    颜色判断
    ARC下方法重复问题
    检查IDFA的方法
    mac 下安装ecplise
    注释使用
    Xcode 8.0 控制台打印问题解决办法
  • 原文地址:https://www.cnblogs.com/killbug/p/4510460.html
Copyright © 2020-2023  润新知