我在两个不同的数据库中有两个逻辑连接的实例。我希望他们都得到保存或回滚。但是如果我在外部块中引发异常 - 嵌套Transaction.atomic
将不会回滚,但为什么呢?
来自文档:
原子块可以嵌套。在这种情况下,当一个内部块 如果成功完成,其效果仍然可以回滚 稍后在外部块中引发异常。
def __commit_to_db(self, mesure, mdm_mesure):
try:
with transaction.atomic():
mesure.save()
with transaction.atomic(using='mdm'):
mdm_mesure.save()
raise Exception('oops')
except (KeyboardInterrupt, SystemExit):
raise
except BaseException as error:
MainLoger.log_error(error)
return
答案 0 :(得分:1)
事务是数据库级功能。因此,虽然您正在嵌套Python代码,但每个数据库实际上都是独立于另一个数据库获得自己的事务。在Django中没有跨越数据库的嵌套事务。
您必须以某种方式重新构建代码。例如,将代码放在atomic()
块中都可以:
try:
with transaction.atomic():
with transaction.atomic(using='mdm'):
mesure.save()
mdm_mesure.save()
# neither transaction will commit
raise Exception('oops')
except Exception:
pass