【发布时间】:2016-01-06 18:10:42
【问题描述】:
我们的系统允许人们下订单,其中包含一种或多种产品。在上个月每周 1500 笔交易中,我有两个订单根本不再在数据库中。
我的日志表明我们已经通过了产品 ORM 对象的创建,以及后续修改和对 save() 的调用,以及订单 ORM 对象的创建,随后的修改和对 save() 的调用.
发生这种情况后,从日志中可以看出,我们成功联系了我们的支付处理方,一切都恢复了,但数据库中没有记录已创建的痕迹。
我的问题是:
- Django 的 ORM 缓冲区是否以某种方式创建了对象?也许处理在某个时候完全停止(没有记录任何异常),并且数据库中还没有真正存在的对象。
- 我是唯一可以访问管理站点的人,我当然没有进入并删除特定记录。我还没有实现删除订单或产品的功能,因为我希望它们永远在数据库中。有没有其他我不知道的对象创建成功后可以删除的方法?
- 我读到检查 pk 成员的 None 是确定对象是否已写入数据库的规范方法。在我的复制案例中,此检查通过。
编辑:
e4c5 的出色回答让我了解了 Django 的数据库事务行为选项。另外两个环境因素导致了这种行为,而我无法诊断它:
- 我们启用了 Django 的 TransactionMiddleware,如果视图没有成功返回,它会回滚所有数据库操作。
- 日志配置问题是在调试服务器中运行时在此特定模块中显示未捕获的异常堆栈跟踪,但在我们的生产环境 (nginx/supervisor/gunicorn) 中运行时却没有。
调用 create() 和 save() 方法后引发未捕获的异常,这导致 TransactionMiddleware 回滚数据库条目。日志记录问题是禁止记录未捕获的异常跟踪,所以我不知道发生了什么。
对于这个特定的视图,我启用了 Django 的默认事务行为:
with transaction.autocommit():
...do my stuff...
在此处了解 Django 的事务选项:https://docs.djangoproject.com/en/1.5/topics/db/transactions/#tying-transactions-to-http-requests
【问题讨论】:
-
也许你的应用程序忘记提交了?
标签: django database postgresql orm