程序 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
# select_for_update ``` user = User.objects.select_for_update().get(username='xxx') # 此时 age=30 user.email = '[email protected]' user.save() ```
@aapeli 这里两个程序更新的不同字段,类似 update user set email='xx' where username='xx', 另一个 update user set age=30 where username='xx' ,这个没必要用锁,互相不影响的