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