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

Django transaction.atomic()的失败模式是什么?,django,transactions,Django,Transactions,面对事务中的数据库序列化错误,我不清楚Django的确切行为 据我所知,文档中没有指定这种行为 如果DB在提交事务(例如,另一个事务更新了当前事务中读取的值)、读取django.DB.transaction.py时遇到一致性错误,则该事务看起来将回滚,并且DatabaseError将引发到调用代码(例如,transaction.atomic()上下文管理器). 这是正确的吗 而且,更重要的是,是否存在可以回滚事务而不让transaction.atomic包装器接收异常的情况 (请注意,我不是问在

面对事务中的数据库序列化错误,我不清楚Django的确切行为

据我所知,文档中没有指定这种行为

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

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

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

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

没错

是否存在可以回滚事务而不让transaction.atomic包装器接收异常的情况

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

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


那么,接下来的问题是——如果总是出现异常,为什么我们需要Django 1.9中添加的
transaction.on\u commit()
?似乎我们总是可以说
try:except DatabaseError:else:
on\u commit
适用于所有事务,而不仅仅是原子事务。