Python Django模型:不推荐手动提交时管理事务
我正在运行Django 1.4.11。我以类似于以下代码的方式重写了Django模型的Python Django模型:不推荐手动提交时管理事务,python,django,django-models,overriding,Python,Django,Django Models,Overriding,我正在运行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): tr
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日志中看到以下消息:
RemovedIndJango18警告:不赞成手动提交,赞成
设置自动提交
如何使用set_autocommit实现相同的逻辑?对于您给出的示例,您可以直接使用。如果代码成功,将提交整个事务。如果出现异常,将回滚更改
@transaction.atomic
def save(self, *args, **kwargs):
super(self.__class__, self).save(*args, **kwargs)
foo() # do_other_things
同样的逻辑如下所示:
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()
decorator:
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
这将在成功退出时提交事务,并在出现异常时回滚 太好了。因此,如果foo()或
save()
方法中的任何其他内容引发异常,则超级save()
的DBMS上的提交不会发生。对吗?没错,除非异常是在原子块中捕获的。通常在super()
中使用self.\uu class\uu
是个坏主意。有关解释,请参见此答案: