没注意 django model.save 有 update_fields 参数更新指定字段,出 bug 后好难排查

查看 80|回复 5
作者:wuwukai007   
  • 程序 A1, 数据 A ,将 age 由 30 更新为 20

    user = User.object.filter(username='xxx', age=30).update(age=20)
  • 程序 A2 在程序 A1 数据库提交之前拿到了 A 对象, 并只更新 email 字段

    user = User.object.get(username='xxx')
    # 此时 age=30
    user.email = '[email protected]'
    user.save()
  • user.save() 默认更新全部字段,又会把 age 变回 30
  • 线上遇到这种问题蛮难排查的,记一下

    两个程序更新不同字段,程序很简单,上锁没必要,直接 save 了,结果悲剧了查了好久

    age, user, 字段, username

  • aapeli   
    两个程序更新不同字段,程序很简单,上锁没必要,直接 save 了,结果悲剧了查了好久
    aapeli   
    # select_for_update
    ```
    user = User.objects.select_for_update().get(username='xxx')
    # 此时 age=30
    user.email = '[email protected]'
    user.save()
    ```
    wuwukai007
    OP
      
    https://blog.csdn.net/kaikai0803/article/details/97278180
    aapeli   
    @aapeli 这里两个程序更新的不同字段,类似 update user set email='xx' where username='xx', 另一个 update user set age=30 where username='xx' ,这个没必要用锁,互相不影响的
    aapeli   
    提一点:楼主的 update_fields 可以解决不同字段同时更新的问题,但可能无法解决并发更新相同字段的问题
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部