对于我们的博客平台,我们有一个“article”模型,它包含一个“updated”datetime字段:

class Article(models.Model):
    updated = models.DateTimeField(null=True, blank=True)
    ...

当一篇文章在24小时内第一次被任何访问者打开时,我们会对不同的模型字段进行一些耗时的计算,然后将模型保存到数据库中。这样,我们还将“updated”字段更新为当前的datetime.now()。
if (datetime.now() - article.updated).days > 1:
    # do some time consuming calculations
    article.updated = datetime.now()
    article.save()

当或多或少同时请求一个项目时,第一个请求的耗时操作尚未完成,这导致每天一次的操作在同一个对象上重新启动(article.updated仍然是旧值)。在开始计算之前另外调用article.save()有帮助吗?或者这个数据从保存到数据库一直推迟到请求完成?

最佳答案

使用django 1.4中引入的querysetselect_for_update,它在数据库中执行行级锁定。所有匹配的条目将被锁定,直到事务块结束,这意味着将阻止其他事务更改或获取对它们的锁定。有一些特定于datgabase后端的问题,所以在完全依赖它之前,一定要阅读并测试它。
其他一些独立于实现的方法是将模型定制为具有locked布尔属性。不是很干净,但可以解决。见What is the simplest way to lock an object in Django

关于database - 防止Django根据并发请求多次将同一对象保存到数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12531746/

10-10 00:41
查看更多