我有一个post_save
处理程序,它会根据刚刚创建或更新的实例将其他记录插入数据库。但是,插入其他记录时可能会发生错误(可能是违反约束)。
如果post_save
处理程序中发生异常,是否仍可能提交初始实例?
答案可能取决于这些子问题:
post_save
信号之前还是之后提交的?post_save
发生错误,Django是否会尝试使用嵌套事务来回滚正在保存的实例?答案 0 :(得分:5)
根据文档,如果您使用autocommit
初始实例的更改将在任何.save()
信号处理程序之前在post_save
上提交。 post_save
中的异常不会将更改回滚到初始实例。
您可以通过查看save_base
中django/db/models/base.py
的来源来确认这一点。自动提交将发生on line 555(在1.4.2中),但post_save
信号未发送until line 564。您还可以看到Django不会尝试在.save()
中使用任何嵌套事务。
如果您正在使用django.middleware.transaction.TransactionMiddleware
并且未使用autocommit
装饰器覆盖其行为,则post_save
期间的异常将回滚整个事务,包括对初始实例的更改。< / p>