gpt4 book ai didi

database - 防止 Django 在并发请求时将同一个对象多次保存到数据库

转载 作者:搜寻专家 更新时间:2023-10-30 22:01:23 24 4
gpt4 key购买 nike

对于我们的博客平台,我们有一个“文章”模型,其中包含一个“更新的”日期时间字段:

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

当任何访问者在 24 小时内首次打开一篇文章时,我们会对不同的模型字段进行一些耗时的计算,然后将模型保存到数据库中。有了这个,我们还将我们的“更新”字段更新为当前的 datetime.now()。

if (datetime.now() - article.updated).days > 1:
# do some time consuming calculations
article.updated = datetime.now()
article.save()

当一篇文章或多或少同时被请求时,第一个请求的耗时操作还没有完成,导致每天一次的操作在同一个对象上再次开始(article.updated 仍然是旧的值(value))。在开始计算之前另外调用 article.save() 是否有帮助?还是将此数据推迟到请求完成后才保存到数据库中?

最佳答案

使用查询集 select_for_update在 Django 1.4 中引入,它在数据库中进行行级锁定。所有匹配的条目都将被锁定,直到事务 block 结束,这意味着将阻止其他事务更改或获取对它们的锁定。有一些特定于 datgabase 后端的陷阱,因此请务必在完全依赖它之前阅读并测试它。

其他一些独立于实现的方法是自定义您的模型以具有 locked bool 属性。不是很整洁但可行的解决方案。参见 What is the simplest way to lock an object in Django

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com