Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型:不推荐手动提交时管理事务_Python_Django_Django Models_Overriding - Fatal编程技术网

Python 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

我正在运行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日志中看到以下消息:

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
是个坏主意。有关解释,请参见此答案: