Python Django(?) ORM 竞争条件

问题描述 投票:0回答:1

我的问题的答案可能是显而易见的,但我想亲自找出答案。

我喜欢 Django ORM 并在我的几乎所有项目中使用它。我目前正在使用 Pyrogram 开发一个电报机器人(可在异步模式下使用 async wait + asyncio.run),并且我想在其中使用 Django ORM。

让我举一个我的任务的简化示例。有一个按钮绑定到数据库中的一个对象,每次单击该按钮都会有条件地减少一个对象中的一个字段并增加另一个对象中的另一个字段:

async def on_button_click():
   obj1 = Object1.objects.get(id=X)
   if obj1.filed1 > 0:
      obj2 = Object2.objects.get(id=X2)
      obj1.field1 -= N
      obj2.field2 += N
      obj1.save()
      obj2.save()

但是,我担心这可能会导致竞争条件,并且通过同时单击多个按钮来执行此代码的结果可能与预期不同(无论是在 if 条件下还是在进一步保存对象时)。

请告诉我处理此类任务的最佳实践是什么。

select_for_update
方法可以满足我的需求吗?

如果 Django ORM 不是一个好的解决方案,我应该考虑哪些 ORM 或数据库?如果 Django ORM 合适,那么处理此类任务的最佳方法到底是什么? 预先非常感谢您的帮助!

python django asynchronous python-asyncio django-orm
1个回答
0
投票

您当然可以使用

select_for_update()
,但是看到您正在使用多个模型,我认为将
if
块(或者更好的是整个视图)包装在 transaction.atomic 装饰器中会更简洁。

您可能还需要F表达式。在这种情况下,它们允许您在数据库级别更新值。

© www.soinside.com 2019 - 2024. All rights reserved.