我正在尝试使用Django 1.6交易来避免我正在开发的游戏中的竞争条件.游戏服务器有一个简单的目标:配对两个玩家.
我目前的做法是:
这是代码:
# data['nickname'] = user's choice
games = GameConnection.objects.all()
if not games:
game = GameConnection.objects.create(connection=unicode(uuid.uuid4()))
game.nick1 = data["nickname"]
game.save()
response = HttpResponse(json.dumps({'connectionId': game.connection, 'whoAmI': 1, 'nick1': game.nick1, 'nick2': ""}))
else:
game = games[0]
conn = game.connection
nick1 = game.nick1
nick2 = data["nickname"]
game.delete()
response = HttpResponse(json.dumps({'connectionId': conn, 'whoAmI': 2, 'nick1': nick1, 'nick2': nick2}))
return response
Run Code Online (Sandbox Code Playgroud)
显然上面的代码存在竞争条件.由于此代码不是原子的,因此可能会发生:
我试过但是整个块下面with transaction.atomic():,或者使用@transaction.atomic …
我正在尝试创建一个查询,用于从Doctrine数据库中检索对象,并按特定的一对多关系的成员数进行排序.
更具体地说:我有两个实体:人和联邦.一个人可以是一个联盟的成员(人有'联邦'关系),一个联盟可能有n个人(联盟为'人'关系).
我想创建一个DQL查询,它将返回联合列表,按照该联盟成员的数量排序.这些方面的东西:
SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of members of f.people]
Run Code Online (Sandbox Code Playgroud)
那将是第一步.还有一个额外的第二步,我不知道是否可以通过单个查询实现,这将在计数之前过滤关系的成员.像这样:
SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of (f.people p where p.attr = value)]
Run Code Online (Sandbox Code Playgroud)
第二个是最佳结果,但第一个满足我的需求,如果第二个案例在单个查询中不可行.
提前致谢.