经过数周的测试和阅读Django源代码,我找到了自己问题的答案:
Transactions
Django的默认自动提交行为仍然适用于我的线程化函数.然而,它在Django文件中写道:
一旦您执行了需要写入数据库的操作,Django就会生成INSERT/UPDATE/DELETE语句,然后执行COMMIT.没有隐式回滚.
最后一句话很直白.除非Django中的某些内容设置了脏标志,否则它不会发出回滚命令.因为我的函数只执行SELECT语句,所以它从未设置脏标志,也没有触发提交.
这与PostgreSQL认为事务需要回滚的事实相反,因为Django为时区发出了SET命令.在查看日志(log)时,我放弃了自己,因为我一直看到这些ROLLBACK语句,并假设Django的事务管理是来源.事实证明并非如此,这没什么大不了的.
Connections个
连接管理是事情变得棘手的地方.原来Django使用signals.request_finished.connect(close_connection)
来关闭它通常使用的数据库连接.因为在Django中通常没有不涉及请求的操作,所以您认为这种行为是理所当然的.
不过,在我的情况下,没有请求,因为作业(job)已经安排好了.没有请求意味着没有信号.无信号表示数据库连接从未关闭.
回到事务方面,结果发现,在事务管理没有任何更改的情况下,只需调用connection.close()
就会在PostgreSQL日志(log)中发出我一直在寻找的ROLLBACK语句.
Solution个
解决方案是允许正常的Django事务管理正常进行,并通过以下三种方式之一关闭连接:
- 编写一个decorator来关闭连接,并在其中封装必要的函数.
- 钩住现有的请求信号,让Django关闭连接.
- 在功能结束时手动关闭连接.
这三个人中的任何一个都会(并且确实)工作.
这让我疯狂了好几个星期.我希望这对其他人有帮助!