Skip to main content
 首页 » 编程设计

python之了解 Django 中的原子事务

2025年05月04日35shangdawei

我正在尝试更新 django 1.8.4 中的两个 IntegerField,所以我决定使用原子事务,但我有一些疑问:

1- 在这种情况下使用原子事务是个好主意吗?使用它的真正好处是什么?效率提高多少?

2- 我如何检查这两个部分是否工作相同?

A.

@transaction.atomic 
class LinkManager(models.Manager): 
    def vote_up(self, pk, increment=True): 
        if increment: 
            <update field 1, incrementing by 1> 
        else: 
            <update field 1, decrementing by 1> 

B.

 class LinkManager(models.Manager): 
        def vote_up(self, pk, increment=True): 
            if increment: 
                with transaction.atomic(): 
                    <update field 1, incrementing by 1> 
            else: 
                with transaction.atomic(): 
                    <update field 1, decrementing by 1> 

请您参考如下方法:

在这种情况下使用原子事务是个好主意吗?

不,atomic 装饰器确保在交易中要么执行全部更新,要么不执行任何更新。在这种情况下它可能完全没用。

atomic 有什么好处?

假设您正在更新表单中的一些模型,atomic 装饰器将确保所有模型都得到更新,或者如果出现错误。完全没有。

效率更高吗?

不,绝对不是。这是一个数据安全问题,它实际上比常规更新效率低且速度慢,因为它需要为每个 block 创建一个事务。

它是如何工作的?

在数据库中更新,而不是获取结果并将其写回,而只是让数据库为您增加它。

像这样:

from django.db.models import F 
SomeModel.objects.filter(pk=123).update(some_field=F('some_field') + 1)