我不清楚Django在交易中面对数据库序列化错误的确切行为。
据我所知,文档transaction.atomic()
docs并未指定此行为。
如果DB在提交事务时遇到一致性错误(例如,另一个事务更新了当前事务中读取的值),则读取django.db.transaction.py
,看起来事务将回滚,并且DatabaseError将是引发到调用代码(例如transaction.atomic()上下文管理器)。这是对的吗?
而且,更重要的是,是否存在事务可以在没有transaction.atomic包装器接收异常的情况下回滚的情况?
(请注意,我并未询问上下文管理器中内部引发的DatabaseErrors,因为文档清楚地解释了它们发生了什么。我只询问数据库错误在事务提交期间发生,这发生在上下文管理器退出时。)
答案 0 :(得分:0)
如果DB在提交事务时遇到一致性错误......看起来事务将回滚,并且DatabaseError将被引发到调用代码(例如transaction.atomic()上下文管理器)。这是对的吗?
是的,确切地说。
是否存在事务可以在没有transaction.atomic包装器接收异常的情况下回滚的情况?
没有。您可以从transaction.py
内的代码验证这一点,其中启动回滚的唯一时间是抛出DatabaseError
。这也在您链接到的documentation中得到确认:
当退出原子块时,Django会查看它是正常退出还是有异常来确定是提交还是回滚。