2015-10-12 46 views
0

我想在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> 

回答

2

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

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

atomic有什么好处?

假设您正在从表单更新几个模型,atomic装饰器将确保所有模型得到更新或者出现错误。一个都没有。

效率更高吗?

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

它如何工作?

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

事情是这样的:

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