我有一个功能,我保存了大量模型(一次数千个),这需要几分钟,所以我写了一个进度条来向用户显示进度。进度条通过轮询URL(来自Javascript)并查看request.session值来查看第一个调用的状态(正在保存的状态)。
问题是第一次调用是在@ transaction.commit_on_success装饰器内,因为当我尝试强制request.session.save()而不是它立即提交它时,我正在使用数据库支持会话被附加到正在进行的事务中。这导致进度条仅在所有保存完成后才更新,从而使其无效。
我的问题是,(我99.99%肯定我已经知道了答案),你能否在交易中提交陈述而不需要做很多事情。即我需要提交request.session.save(),同时留下所有其他人。
非常感谢,Alex
答案 0 :(得分:1)
不,您的主要保存和状态栏更新都将使用相同的数据库连接进行,因此它们将成为同一事务的一部分。
我可以看到两种方法来避免这种情况。
您可以创建自己的独立数据库连接,并使用该连接保存状态栏更新。
根本不要将状态栏更新保存到数据库,而是使用缓存来存储它们。只要您不使用数据库缓存后端(理想情况下您使用memcached),这将正常工作。
我首选的选项是第二个。您需要深入研究Django内部以获得自己的数据库连接,以便最终可能变得脆弱和混乱。