【发布时间】:2011-04-08 21:22:07
【问题描述】:
我有一个模型 MyModel,它有一个字段 expire_datetime。
每次用户检索 MyModel 的实例时,我需要先 检查它是否已过期。如果它已经过期,比我需要 增加一些计数器,更新其他的,然后扩展 expiration_datetime 到未来的某个时间。
所以视图会做这样的事情:
if object.expiration_datetime < datetime.datetime.now():
object.counter = F('counter') + 1
object.expiration_datetime = F('expiration_datetime') + datetime.timedelta(days=1)
object.save()
上面的代码中有一个竞争条件。说线程 1 检查和 发现当前实例已过期,继续递增 计数器并延长到期日期时间。但在它可以做之前 因此,线程 2 被调度并执行相同的操作。到时间线程 1 终于完成了,计数器增加了两次,并且 expration_datetime 已延长两次。
这看起来应该是一个很常见的问题。处理它的最有效方法是什么?理想情况下,我希望能够以数据库可移植的方式在 Django 中处理它。
【问题讨论】:
标签: python mysql database django race-condition