[英]Django models: managing transactions when commit_manually is deprecated
我正在運行Django 1.4.11。 我以類似於以下代碼的方式覆蓋Django模型的save()
方法:
from django.db import models
from django.db import transaction
class MyModel(models.Model):
# model definition
@transaction.commit_manually
def save(self, *args, **kwargs):
try:
super(self.__class__, self).save(*args, **kwargs)
foo() # do_other_things
except:
transaction.rollback()
raise
else:
transaction.commit()
當我運行我的代碼時,有時我會在Apache日志中閱讀此消息:
RemovedInDjango18Warning:commit_manually已棄用,支持set_autocommit。
如何使用set_autocommit實現相同的邏輯?
相同的邏輯看起來像這樣:
from django.db import models
from django.db import transaction
class MyModel(models.Model):
# model definition
def save(self, *args, **kwargs):
transaction.set_autocommit(False)
try:
super(MyModel, self).save(*args, **kwargs)
foo() # do_other_things
except:
transaction.rollback()
raise
else:
transaction.commit()
finally:
transaction.set_autocommit(True)
但是,這相當於使用atomic()
裝飾器:
from django.db import models
from django.db import transaction
class MyModel(models.Model):
# model definition
@transaction.atomic
def save(self, *args, **kwargs):
super(MyModel, self).save(*args, **kwargs)
foo() # do_other_things
這將在成功__exit__
上提交事務,並在異常情況下回滾。
對於您給出的示例,您可以使用transaction.atomic
。 如果代碼成功,則將提交整個事務。 如果存在異常,則將回滾更改。
@transaction.atomic
def save(self, *args, **kwargs):
super(self.__class__, self).save(*args, **kwargs)
foo() # do_other_things
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.