想象一下,你有一个简单的工作项表:
|ID |OWNER|... +---+-----+--- |123| |... |456| |... |789| |...
我们希望提供一个http API来获取尚未拥有所有者的下一个工作项.
我们使用Postgresql.
我们使用Django-ORM访问该表.
如果API能够被许多用户同时访问,我想有几种竞争条件.
如何确保使用给定的工具(Postgresql,Django)解决所有竞争条件(如果为两个或更多用户提供工作项,则这是一个主要错误).
随着Django 1.11,select_for_update开始支持skip_locked.这意味着您可以保存save()调用,因为您不必立即将其分配给所有者.
例如,建立在@ user73657的答案之上:
with transaction.atomic(): work_item = WorkItem.objects.select_for_update().filter(owner__isnull=True).first() work_item.owner = request.user work_item.save(update_fields=['owner']) # process work_item
你可以做:
with transaction.atomic(): work_item = WorkItem.objects.select_for_update(skip_locked=True).filter(owner__isnull=True).first() work_item.owner = request.user # process work_item,edit other fields work_item.save()
使用skip_locked = True,事务会跳过锁定的行,因此是非阻塞的.作为奖励,您只需要保存到数据库一次.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。