在事务中强制提交嵌套的save()

时间:2011-09-19 14:15:41

标签: python sql django

我有一个功能,我保存了大量模型(一次数千个),这需要几分钟,所以我写了一个进度条来向用户显示进度。进度条通过轮询URL(来自Javascript)并查看request.session值来查看第一个调用的状态(正在保存的状态)。

问题是第一次调用是在@ transaction.commit_on_success装饰器内,因为当我尝试强制request.session.save()而不是它立即提交它时,我正在使用数据库支持会话被附加到正在进行的事务中。这导致进度条仅在所有保存完成后才更新,从而使其无效。

我的问题是,(我99.99%肯定我已经知道了答案),你能否在交易中提交陈述而不需要做很多事情。即我需要提交request.session.save(),同时留下所有其他人。

非常感谢,Alex

1 个答案:

答案 0 :(得分:1)

不,您的主要保存和状态栏更新都将使用相同的数据库连接进行,因此它们将成为同一事务的一部分。

我可以看到两种方法来避免这种情况。

  1. 您可以创建自己的独立数据库连接,并使用该连接保存状态栏更新。

  2. 根本不要将状态栏更新保存到数据库,而是使用缓存来存储它们。只要您不使用数据库缓存后端(理想情况下您使用memcached),这将正常工作。

  3. 我首选的选项是第二个。您需要深入研究Django内部以获得自己的数据库连接,以便最终可能变得脆弱和混乱。