[英]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.