【发布时间】:2015-11-11 07:57:20
【问题描述】:
我有以下场景:
@transaction.atomic()
def some_method():
# some database logic
a.save() # Success. Eligible for Rollback.
with transaction.atomic():
# some more database logic
# Success. Shouldn't be rollbacked
b.save()
raise Exception
我想要做的是,当我引发异常时,不应该回滚内部事务块的更改,而应该回滚在外部块中完成的更改。
这意味着,回滚 - a.save(),但提交 b.save()。那可能吗?我猜那里的上下文管理器会创建一个保存点。那么,如果内部块成功运行,它不应该提交到保存点吗?在这种情况下它的表现如何?
我读了docs here,上面写着:
原子块可以嵌套。在这种情况下,当一个内部块 成功完成,它的效果可以仍然可以回滚 稍后会在外部块中引发异常。
它说可以回滚,但不是将回滚。它到底是什么意思?回滚确定吗?
【问题讨论】:
-
根据事务的定义,如果事务本身失败,您不能提交
b.save()。您需要重新考虑交易/保存点块的结构。 -
如果包含事务的任何地方出现异常,它将回滚。可以这样读:“当一个内部块成功完成时,它的影响仍然可以回滚。具体来说,如果稍后在外部块中引发异常,整个事务将被回滚,包括内部块。 "
标签: python django python-2.7 transactions django-orm