Django嵌套的Transaction.atomic没有回滚

时间:2017-03-31 05:36:29

标签: python django django-orm

我在两个不同的数据库中有两个逻辑连接的实例。我希望他们都得到保存或回滚。但是如果我在外部块中引发异常 - 嵌套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

1 个答案:

答案 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