首页 > 解决方案 > django 中的原子事务是数据库级别的吗?

问题描述

我有一个在 docker 容器上运行的 django 后端应用程序,我在某些需要的地方使用原子事务

所以因为我的流量很大,而且有很多地方需要昂贵的计算,我想运行另一个 django 应用程序实例,并平衡负载,

我的问题是instance1启动了一个原子事务,并且instance2想在同一记录上启动一个原子事务,是否instance2看到instance1正在运行原子事务,所以请求会等到instance1完成?

谢谢

标签: djangodatabaseatomic

解决方案


是的,Django 能够处理这类请求!

对于并发事务,您可以在块内使用select_for_update方法managerqueryset对象。你可以从这里transaction.atomic()找到文档。select_for_update

注意transaction.atomic()with select_for_update() 的用法用于处理数据库级别的并发性和原子性。

select_for_update在数据库级别执行以下类型的查询。

SELECT FOR UPDATE wallet where wallet.id = '1'

from django.db import transaction

user_wallet = Wallet.objects.select_for_update().get(user=request.user)  # select for update query
with transaction.atomic():   # atomic transactions block
    user_wallet.amount += Decimal('200')  # updating user's wallet amount
    user_wallet.save()

有关更多信息,请参阅Django 数据库事务文档


推荐阅读