django - django 中的原子事务是数据库级别的吗?
问题描述
我有一个在 docker 容器上运行的 django 后端应用程序,我在某些需要的地方使用原子事务
所以因为我的流量很大,而且有很多地方需要昂贵的计算,我想运行另一个 django 应用程序实例,并平衡负载,
我的问题是instance1
启动了一个原子事务,并且instance2
想在同一记录上启动一个原子事务,是否instance2
看到instance1
正在运行原子事务,所以请求会等到instance1
完成?
谢谢
解决方案
是的,Django 能够处理这类请求!
对于并发事务,您可以在块内使用select_for_update
方法manager
或queryset
对象。你可以从这里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 数据库事务文档