理解Django中的原子事务

时间:2015-10-12 08:59:49

标签: python django transactions atomic

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

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

2-如何检查这两件作品是否相同?

一个。

@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>

 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>

1 个答案:

答案 0 :(得分:6)

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

不,atomic装饰器确保在事务中执行全部或不执行更新。在这种情况下,它可能完全没用。

atomic有什么好处?

假设您正在从表单更新一些模型,atomic装饰器将确保所有模型都得到更新,或者是否有错误。完全没有。

效率更高吗?

不,绝对没有。这是一个数据安全的事情,它实际上效率低于常规更新,因为它需要为每个块创建一个事务。

它如何运作?

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

这样的事情:

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