1

此应用程序用于租赁服务。分发工具时,我需要将客户密钥保存在工具的“who_has”属性中,并将工具密钥添加到分发订单中。如果出现任何问题,我需要删除所有以前编写的 'who_has' 属性。

我认为 Trancastions 是这样做的方法。所以这是我的代码

def get_tools(tool_ids):
    tools =[]
    for t in tool_ids:
            tool = classes.ToolUnits.get_by_id(int(t))
            tools.append(tool)

    return tools

@ndb.transactional(xg=True)
def process_handout(self):
    customer_id = self.request.get("customer")
    tool_ids = self.request.get("units")

    if not customer_id == 'false' and (not tool_ids=="[]" or not tool_ids):
        customer = classes.Customers.get_by_id(int(customer_id))

        order = classes.Orders(
            customer = customer.key,
            handout = True,
            transferred = [],
            booked = [],
        )

        tools = get_tools(json.loads(tool_ids))

        for tool in tools:

            if not tool.who_has:
                tool.who_has = customer.key
                order.transferred.append(tool.key)
                tool.put()
            else:
                # if tool is already taken
                order.booked.append(tool.key)

        order.put()
        self.redirect('/order/%s' % order.key.id())
    else:
        self.redirect('/tools')

两个工具都可以正常工作,但是 8 个工具会引发错误: BadRequestError: operating on too many entity groups in a single transaction.

显然,每个tool.put()都被视为一个实体组。我如何将他们团结在一个小组中?

我试过文档,但对我来说都是中文的。你能解释一下我的例子吗?

4

1 回答 1

3

您正在使用限制为 5 个参与交易的实体的跨组 ( xg=True)交易。

实体组由祖先路径定义:这仅意味着对于特定实体(或多个实体),您定义父实体,并且对于该父实体,您可以再次定义父实体,基本上定义实体树。所有这些实体都属于同一个实体组。组的根是树根处的实体:其他实体(直接或间接)定义为父实体,但它本身没有定义父实体。

如果您没有定义实体的父级,并且您也没有将此实体用作其他实体的父级,则此实体是它自己的实体组的根。

一个简化的理由:实体组基本上意味着“将所有实体放在同一台机器上”,以便 GAE 可以轻松地对它们进行事务性更改。

限制是实体组(= 实体组内的所有实体)每秒只能更新一次。因此,您需要小心如何构建数据。一种好方法是使用 user 作为实体组的根,因为用户行为独立并且往往不会在很短的时间内创建多个请求。

希望这能澄清一些事情。

于 2013-11-15T08:01:53.350 回答