save方法中的django回滚事务

wil*_*.am 5 python django

我有以下代码覆盖模型的save方法:

@transaction.commit_on_success
def save(self, *args, **kwargs):

    try:
        transaction.commit()
        self.qa.vote_down_count += 1
        self.qa.save()

        super(self.__class__, self).save(*args, **kwargs)

    except:
        transaction.rollback()
        raise
    else:
        transaction.commit()
Run Code Online (Sandbox Code Playgroud)

预期的行为是:self.qa属性vote_down_count加1,但如果在super(self)save方法中发生任何异常,则事务回滚(这意味着self.qa.vote_down_count + = 1未在数据库中提交) ).

实际行为是:即使IntegrityError异常从super(self)save引发,self.qa.vote_down_count + = 1也会提交到数据库.

有没有?

Mik*_*one 6

为什么不简单地做:

@transaction.commit_manually
def save(self, *args, **kwargs):
    try:
        super(self.__class__, self).save(*args, **kwargs)
        self.qa.vote_down_count += 1
        self.qa.save()
    except:
        transaction.rollback()
        raise
    else:
        transaction.commit()
Run Code Online (Sandbox Code Playgroud)

这就是文档暗示这样做的方式,虽然他们说在你的视图函数中这样做,所以你可能不需要@transaction.commit_manuallyon save()方法,而是把它放在视图上.