小编Ale*_*lho的帖子

Django 1.6交易避免了竞争条件

我正在尝试使用Django 1.6交易来避免我正在开发的游戏中的竞争条件.游戏服务器有一个简单的目标:配对两个玩家.

我目前的做法是:

  1. 用户想玩
  2. 服务器检查是否还有其他人在等待播放.
    1. 如果没有,则创建一个GameConnection对象(具有唯一标识符 - uuid4).
    2. 如果,它得到了GameConnection识别并删除GameConnection.

这是代码:

# 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)

显然上面的代码存在竞争条件.由于此代码不是原子的,因此可能会发生:

  • 检查游戏连接.找不到.
  • A创建游戏连接.
  • B检查游戏连接.找到一个(A).
  • C检查游戏连接.找到一个(A).
  • B获得A的连接标识符并开始游戏.
  • C获取A的连接标识符并启动游戏.

我试过但是整个块下面with transaction.atomic():,或者使用@transaction.atomic …

python django multithreading transactions race-condition

7
推荐指数
1
解决办法
579
查看次数

如何按关系的数量或成员对Doctrine DQL查询进行排序?

我正在尝试创建一个查询,用于从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)

第二个是最佳结果,但第一个满足我的需求,如果第二个案例在单个查询中不可行.

提前致谢.

database doctrine dql symfony doctrine-orm

5
推荐指数
2
解决办法
3953
查看次数