transaction.atomic()的失败模式是什么?

时间:2016-06-01 18:38:44

标签: django transactions

我不清楚Django在交易中面对数据库序列化错误的确切行为。

据我所知,文档transaction.atomic() docs并未指定此行为。

如果DB在提交事务时遇到一致性错误(例如,另一个事务更新了当前事务中读取的值),则读取django.db.transaction.py,看起来事务将回滚,并且DatabaseError将是引发到调用代码(例如transaction.atomic()上下文管理器)。这是对的吗?

而且,更重要的是,是否存在事务可以在没有transaction.atomic包装器接收异常的情况下回滚的情况?

(请注意,我并未询问上下文管理器中内部引发的DatabaseErrors,因为文档清楚地解释了它们发生了什么。我只询问数据库错误在事务提交期间发生,这发生在上下文管理器退出时。)

1 个答案:

答案 0 :(得分:0)

  

如果DB在提交事务时遇到一致性错误......看起来事务将回滚,并且DatabaseError将被引发到调用代码(例如transaction.atomic()上下文管理器)。这是对的吗?

是的,确切地说。

  

是否存在事务可以在没有transaction.atomic包装器接收异常的情况下回滚的情况?

没有。您可以从transaction.py内的代码验证这一点,其中启动回滚的唯一时间是抛出DatabaseError。这也在您链接到的documentation中得到确认:

  

当退出原子块时,Django会查看它是正常退出还是有异常来确定是提交还是回滚。