簡體   English   中英

我應該在Django的save方法中的哪里使用原子事務?

[英]Where should I use atomic transactions in Django's save method?

這是對原子事務的適當使用嗎? 為什么或者為什么不?

def save(self, **kwargs):
    try:
        with transaction.atomic:
            super(User, self).save(**kwargs)
            if self.image:
                img = Image.open(self.image.path)
                if img.height > 300 or img.width > 300:
                    output_size = (300, 300)
                    img.thumbnail(output_size)
                    img.save(self.image.path)
    except (OSError, IOError):
        self.image = None
        with transaction.atomic:
            super(User, self).save(update_fields=['image'])
        raise PValidationError('Image can`t be saved')

嗨,也許你可以使用這樣的事情:

class MyModel(models.Model):
    # model definition

    def save(self, *args, **kwargs):
        transaction.set_autocommit(False)
        try:
            super(MyModel, self).save(*args, **kwargs)
            # do_other_things
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()
        finally:
            transaction.set_autocommit(True)

但是更好的方法是使用這樣的東西:

class MyModel(models.Model):
    # model definition

    @transaction.atomic
    def save(self, *args, **kwargs):
        super(MyModel, self).save(*args, **kwargs)

請獲取更多信息,請檢查: @ transaction.atomic

祝好運..!!

我認為您實際上不需要兩個原子事務中的任何一個。 可以使用原子交易的最好例子是將錢從一個帳戶轉移到另一個帳戶,例如:

def transfer_money(source_account, destination_account, quota):
    source_account.amount_of_money -= quota
    source_account.save()
    # K-BOOM
    destination_account.amount_of_money += quota
    destination_account.save()

如果在# K-BOOM瞬間出了什么問題怎么辦? 一個帳戶將有較少的錢,而第二個帳戶將沒有應有的更多。

這就是為什么我們需要整個transfer_money函數是原子的:

@transaction.atomic
def transfer_money(source_account, destination_account, quota):
    source_account.amount_of_money -= quota
    source_account.save()
    # K-BOOM
    destination_account.amount_of_money += quota
    destination_account.save()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM