Skip to main content
 首页 » 编程设计

python之Django并发获取和增量

2024年10月24日36myhome

假设我有一个模型 A,它有一个 account_number 字段,当一个新实例 < strong>A 在我的模型 B 中创建了一个counter 字段> 将它的值增加 1。此值与我的 account_number 字段将收到的值相同。

我想保护操作免受并发修改,以便我的account_number 始终是正确的。

我想做如下的事情:

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

同时更新 B 中的counter 值

如何在 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_COMMITTED 或更高的事务隔离级别上完成。 (在 PostgreSQL 中,默认隔离级别是 READ_COMMITTED,我不确定其他数据库。)

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