背景
在最近做的一个消耗能量型的需求中,因为 Nginx 的重复转发或者客户端的连续点击,造成了同样的接口在极短时间内被调用两次,数据库中出现了重复记录。
于是,我想利用 MySQL 的锁机制,在某一条记录被操作的时候,给此条记录添加行锁,就可以避免出现上述 bug。
解决流程
定位 bug 过程不再赘述,解决流程如下:
- 在利用 Django ORM 取数据时,在查询语句前添加
select_for_update()
方法。添加前:existUser = User.objects.get(id=userId) ==================================================================== 添加后:existUser = User.objects.select_for_update().get(id=userId)
select_for_update()
这个方法有两个默认参数,nowait=False
和skip_locked=F