在使用Postgres的Django 1.3项目中,我有一个“DatabaseError:当前事务被中止”来来去去(具体来说,是841中的11次)。该项目是一个测验站点,当用户在视图中提交答案表单时会发生错误。从数据库的角度来看,该过程涉及许多查询,如下所示:
在那个折磨过程的某个地方,这个错误就会出现(我猜是因为一个查询不等待其他查询)。在生产中(即DEBUG = False),我有办法在这种情况下记录数据库错误吗?我正在使用WebFaction和Postgres error logs are not available to me。我可以从这个middleware example偷东西来解决这个具体案例吗?
或者,是否有更好的方法来查找此错误,或者我应该在事务中包装单个查询(遗憾的是,它们不是在代码中的所有位置,不确定是否将视图包装在事务装饰器中帮助)?
*只是为了混淆问题,在开发过程中添加了多个正确的答案要求,然后在我们上线之前就删除了,所以我可以稍微简化这个过程,基本上跳过第1步和第4步,但我想要知道这种神秘问题的一般答案。
答案 0 :(得分:1)
您还没有说过在7个步骤中您的交易开始和结束。这将有助于了解。
“事务中止”消息的一个来源是由于死锁。更多细节将在PostgreSQL日志中。
但最重要的是,如果您无法访问PostgreSQL错误消息,那么调试PostgreSQL将会继续遇到痛苦和耗时的经验。借助WebFaction来解决这个问题。如果它们无济于事并且您的时间价值很高,那么通过迁移到提供此基本功能的环境,您的底线成本将会降低。
答案 1 :(得分:1)
您必须为事务启用自动提交。在DATABASES
条目中,请添加:
'OPTIONS': {'autocommit': True,},
默认情况下,Django会在第一个查询时打开一个事务。通过使用此选项,您必须手动启动事务(例如,使用@commit_on_success
)。由于不再打开任何事务,您将获得先前由事务错误屏蔽的实际错误。
自动提交设置将是Django 1.6的新默认设置,请参阅https://docs.djangoproject.com/en/dev/ref/databases/#postgresql-notes