google应用引擎跨组交易需要父节点

2024-04-30 03:59:11 发布

您现在位置:Python中文网/ 问答频道 /正文

据我所知@事务数据库(xg=True)允许跨组事务,但是下面的代码返回“事务内部的查询必须有祖先”。在

@db.transactional(xg=True)
def insertUserID(self,userName):
    user = User.gql("WHERE userName = :1", userName).get()
    highestUser = User.all().order('-userID').get()
    nextUserID = highestID + 1 
    user.userID = nextUserID
    user.put()

尽管是跨组事务,但是否需要为每个实体传入密钥?你能帮我修改一下这个例子吗?在


Tags: 代码数据库truedbgetdefusername事务
3条回答

XG事务可以跨max 25 entity组应用。祖先查询将查询限制为单个实体组,并且您可以在单个XG事务中在这25个实体组中执行查询。在

没有父级的事务查询可能会包括应用程序中的所有实体组,并锁定所有内容,因此您将得到一条错误消息。在

应用程序引擎通常试图避免单调增加的id。自动分配的可能是1011000100010002等等。如果您知道您需要单调递增的ids-it,并且它对您的性能有好处,那么:

  1. 有某种userId的模型表示来启用key_name 使用和直接查找

  2. 查询事务外的用户id,获取最高候选id

  3. 在事务中,请执行get_或_insert;lookupUserId.get_按_key_name(候选ID+1)。如果 已经存在并指向其他用户,请使用+2重试 等等,直到找到一个免费的并创建它,更新 同一用户标识的用户。

如果更新UserId+User的XG事务太慢,可能在事务中创建UserId+task(而不是XG),然后让执行的任务将UserId和User关联起来。或者是一个后端,它可以序列化UserId的创建,如果您尝试避免序列中的漏洞,并且每秒执行50个创建,那么可能允许put_async。在

如果可以使用用户名作为key_name,您可以直接查找而不是查询,从而使事情变得更快、更便宜。在

每个数据存储实体都有一个键,一个键(amount other things)有一个数字id,AppEngine会给它分配一个键的名称,你可以给它。在

在您的例子中,似乎可以使用数字标识,在对用户实体调用put()之后,您将得到:用户.key().id()(或用户.key.id()如果您使用的是NDB),它对于每个用户都是唯一的(只要所有用户都有相同的父级,这在您的代码中是没有的)。在

此id不是连续的,但保证是唯一的。在

跨组事务允许您跨多个组执行一个事务,但它们不会取消对事务内部查询的禁止。您需要在事务之外执行查询,并传入实体的ID(然后检查查询中指定的所有不变量是否仍然有效),或者,正如Shay建议的那样,使用ID,这样您就不必首先执行查询。在

相关问题 更多 >