Python Django并发获取和增量

Python Django并发获取和增量,python,django,transactions,Python,Django,Transactions,假设我有一个模型a,它有一个账号字段,当创建了a的新实例时,我的模型B中的计数器字段将其值增加一。该值将与我的账号字段接收的值相同 我想保护操作不受并发修改的影响,以便我的账号始终是正确的 我想做如下事情: instance.account_number = F('modelB_table.counter') + 1 同时更新B中的计数器值 如何在Django 1.9中实现这一点? 在这种情况下,事务是否有帮助?是的,您可以使用事务在Django中实现这一点。你可以这样做: with tran

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

我想保护操作不受并发修改的影响,以便我的账号始终是正确的

我想做如下事情:

instance.account_number = F('modelB_table.counter') + 1
同时更新B中的计数器

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


在这种情况下,事务是否有帮助?

是的,您可以使用事务在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\u COMMITTED
或更高的事务隔离级别上完成。(在PostgreSQL中,默认隔离级别是
READ\u COMMITTED
,我不确定是否有其他数据库。)


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

可能会像Django ORM
F('modelbu table\uu counter')中的其他地方一样使用双下划线语法。
@Anentropic,但这只会在实例中设置帐号,不更新BLooks中的计数器,就像这是一个重复的问题,请参见问题。@Andrey这不是重复的问题,我要求的是并发控制技术