2015-10-12 45 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)