2016-06-19 6 views
0

私のライブラリアプリケーションのutilクラスからの保存メソッドがあります。自己定義utils.pyで:メソッド関連トランザクションのDjangoアトミックトランザクション

def update_book_count(key): 
    key_to_update = BookConfig.objects.get(key=key) 
    """ 
    returns {'key': 'Chemistry-700', 'count': 15} 
    """ 
    key_to_update.count = key_to_update.count + 1 
    key_to_update.save() 

forms.pyにこのコードを考えてみましょう:

class AddBookForm(forms.Form): 
    #some fields 

    def save(self): 
     title = self.cleaned_data.get('title') 
     category = self.cleaned_data.get('category') #Chemistry 

     try: 
      with transaction.atomic(): 
       book = Book(title=title, category=category) 
       book.save(force_insert=True, force_update=False) 
       update_book_count(category) 
       #Say just for this case, I find reservations for this title 
       loan = Loan.objects.filter(
       title=title,status="PENDING_BOOK_PURCHASE") 
       loan.update(status="PENDING_MEMBER_COLLECTION") 
     except IntegrityError: 
      print("Atomic Txn Error") 

私の質問は:atomic()update_book_count方法でデータベーストランザクションに及ぶのか?具体的に:

  1. update_book_countメソッドが失敗した場合、book.save()トランザクションはあまりにもロールバックされますでしょうか?
  2. loan.update()メソッドが失敗した場合、update_book_countもロールバックされますか?

答えて

1

まず、あなたの質問にお答えします

  1. を例外はバブルアップして(それは意志あなたのコードを見て)withの文のうち、[はい、トランザクションはロールを取得する場合はバック。

  2. はい、トランザクションがロールバックされると、それまでに起こったことはすべて元に戻されます。あなたが1内部で実行する場合は、このトランザクションでカバーされ、以前のように手動でメソッドを呼び出します(そして忘れを心配する必要はありませんので、ところで

、あなたは自動的に、このようなカウントフィールドを更新するための信号を使用する必要があります)。そして、オブジェクトが削除されたときに、それが機能するという追加の利点が得られます。

from django.db.models.signals import post_save, post_delete 
from django.dispatch import receiver 
from django.db import transaction 

@receiver(post_save, sender=Book) 
@receiver(post_delete, sender=Book) 
@transaction.atomic 
def _update_count(sender, instance, using, **kwargs): 
    # get total number of books with this category 
    count = Book.objects.filter(category=instance.category).count() 

    # update the denormalized data 
    BookConfig.objects.filter(key=instance.category).update(count=count) 

Django signal documentation

関連する問題