Django nested transactions - “with transaction.atomic()”年的问题是,考虑到这一点...
def functionA():
with transaction.atomic():
#save something
functionB()
def functionB():
with transaction.atomic():
#save another thing
如果functionB
失败并回滚,functionA
也会回滚吗?
Kevin Christopher Henry回答说,"是的,如果在任何一个函数中发生异常,它们都将被回滚."然后他引用了the docs句话,其中说:
原子块可以嵌套.在这种情况下,当内部挡路成功完成时,如果稍后外部挡路引发异常,其效果仍然可以回滚.
这篇文档引用似乎没有解决最初的问题.文档是说,当内部的挡路(即functionB
%)成功完成时,如果外部的挡路(即函数A)引发异常,其效果仍然可以回滚.但这个问题指的是相反的情况.问题是,如果内部的挡路(functionB
)出现故障,外部的挡路(functionA
)是否回滚?这篇文档引文没有提到那个场景.
然而,在文档的下面我们看到了这个例子...
from django.db import IntegrityError, transaction
@transaction.atomic
def viewfunc(request):
create_parent()
try:
with transaction.atomic():
generate_relationships()
except IntegrityError:
handle_exception()
add_children()
...接下来是 comments ...
在本例中,即使
generate_relationships()
因违反完整性约束而导致数据库错误,您也可以在add_children()
中执行查询,并且create_parent()
中的更改仍然存在.
如果我正确阅读了文档,说明对generate_relationships()
的调用(类似于原始问题中对functionB
的调用)可能会失败,并且在create_parent()
和add_children()
中所做的更改将提交到数据库.这似乎与凯文·克里斯托弗·亨利的回答相矛盾.
令我困惑的是,我在Django nested Transaction.atomic个问题/答案中看到了同样的问题/答案.
我对Django和Stackoverflow都是新手,所以我对阅读文档没有太大的信心,但这似乎与这两种react 相矛盾.我想从更有经验的人那里得到一些澄清.非常感谢你.