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