相关疑难解决方法(0)

我如何处理django中的这种竞争条件?

此代码应该获取或创建一个对象,并在必要时更新它.该代码在网站上正在生产中使用.

在某些情况下 - 当数据库繁忙时 - 它将抛出异常"DoesNotExist:MyObj匹配查询不存在".

# Model:
class MyObj(models.Model):
    thing = models.ForeignKey(Thing)
    owner = models.ForeignKey(User)
    state = models.BooleanField()
    class Meta:
        unique_together = (('thing', 'owner'),)

# Update or create myobj
@transaction.commit_on_success
def create_or_update_myobj(owner, thing, state)
    try:
        myobj, created = MyObj.objects.get_or_create(owner=user,thing=thing)

    except IntegrityError:
        myobj = MyObj.objects.get(owner=user,thing=thing)
        # Will sometimes throw "DoesNotExist: MyObj matching query does not exist"

    myobj.state = state
    myobj.save()
Run Code Online (Sandbox Code Playgroud)

我在ubuntu上使用innodb mysql数据库.

我该如何安全地处理这个问题?

django innodb

28
推荐指数
1
解决办法
8932
查看次数

Django:如何以线程安全的方式执行get_or_create()?

在我的Django应用程序中,我经常需要做类似的事情get_or_create().例如,

用户提交标签.需要查看该标记是否已存在于数据库中.如果没有,请为其创建新记录.如果是,只需更新现有记录.

但是看看get_or_create()它的文档似乎不是线程安全的.线程A检查并查找记录X不存在.然后线程B检查并发现记录X不存在.现在,线程A和线程B都将创建一个新的记录X.

这一定是非常普遍的情况.我如何以线程安全的方式处理它?

python database django concurrency thread-safety

19
推荐指数
2
解决办法
6575
查看次数

不应该将django的模型get_or_create方法包装在事务中吗?

我正在浏览django的源代码并查看了get_or_create.不应该用交易包裹吗?

谢谢

django django-models

10
推荐指数
1
解决办法
2466
查看次数

为什么此循环不会每五秒显示一次更新的对象计数?

我使用这个python代码每5秒输出一件事:

def my_count():     
    while True:
        print "Number of Things: %d" % Thing.objects.count()
        time.sleep(5)

my_count() 
Run Code Online (Sandbox Code Playgroud)

如果另一个进程在my_count()运行时生成一个新的Thing,my_count()将继续打印相同的数字,即使它现在在数据库中已更改.(但是如果我杀了my_count()并重新启动它,它将显示新的Thing计数.)

东西存储在MYSQL innodb数据库中,此代码在ubuntu上运行.

为什么my_count()会在不重新启动的情况下显示新的Thing.objects.count()?

python mysql django

8
推荐指数
1
解决办法
1383
查看次数