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

3 投票
1 回答
977 浏览
提问于 2025-04-17 02:36

我有一个函数,用来保存大量的模型(一次可以保存几千个),这个过程需要几分钟,所以我写了一个进度条来显示给用户。这个进度条是通过JavaScript定期请求一个网址,然后查看request.session中的一个值,来了解第一次调用(也就是保存的那个)的状态。

问题是,第一次调用是在一个@transaction.commit_on_success的装饰器里面,因为我使用的是数据库支持的会话,当我试图强制执行request.session.save()时,它并不会立即提交,而是会被添加到正在进行的事务中。这就导致进度条只有在所有保存完成后才会更新,从而变得没有用。

我的问题是,(我99.99%确定我已经知道答案了)在一个事务中,能否提交某些语句而不提交全部?也就是说,我只想提交request.session.save(),而不影响其他的保存。

非常感谢,Alex

1 个回答

1

不,您的主要保存和状态栏更新都会使用同一个数据库连接,所以它们会在同一个事务中进行。

我看到有两个方法可以避免这个问题。

  1. 您可以创建一个单独的数据库连接,使用这个连接来保存状态栏的更新。

  2. 也可以选择不把状态栏的更新保存到数据库,而是使用缓存来存储它们。只要您不使用数据库的缓存后端(最好使用memcached),这样做就没问题。

我更倾向于第二种方法。您需要深入了解Django的内部机制来获取自己的数据库连接,这样可能会导致代码变得脆弱和混乱。

撰写回答