Django并发获取和增加

2024-06-02 06:06:59 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个模型a它有一个账号字段,当一个a的新实例被创建时,我的模型中的计数器字段将其值增加一。此值将与我的账户号码字段接收的值相同。在

我想保护操作不被并发修改,这样我的账号总是正确的。在

我想做如下的事情:

instance.account_number = F('modelB_table.counter') + 1

同时更新B中的计数器

如何在Django 1.9中实现这一点?

在这种情况下,<交易会有帮助吗?


Tags: django实例instance模型numbercountertable计数器
1条回答
网友
1楼 · 发布于 2024-06-02 06:06:59

是的,您可以使用事务在Django中实现这一点。你会做一些类似的事情:

with transaction.atomic():
    ModelB.objects.update(counter=F('counter') + 1)
    new_counter = ModelB.objects.get().counter
    a_instance.account_number = new_counter
    a_instance.save()

这需要在READ_COMMITTED或更高的事务隔离级别上完成。(在PostgreSQL中,默认的隔离级别是READ_COMMITTED,其他数据库我不确定。)

它之所以有效,是因为隔离级别使脏读成为不可能,因此在另一个提交之前,并发事务无法更新计数器。在

相关问题 更多 >