加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用PostgreSQL在Django中获取下一个工作项

发布时间:2020-12-13 18:06:00 所属栏目:百科 来源:网络整理
导读:想象一下,你有一个简单的工作项表: |ID |OWNER|...+---+-----+---|123| |...|456| |...|789| |... 我们希望提供一个http API来获取尚未拥有所有者的下一个工作项. 我们使用PostgreSQL. 我们使用Django-ORM访问该表. 如果API能够被许多用户同时访问,我想有几
想象一下,你有一个简单的工作项表:
|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,事务会跳过锁定的行,因此是非阻塞的.作为奖励,您只需要保存到数据库一次.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读