- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此应用程序用于租赁服务。分发工具时,我需要将客户 key 保存在工具的“who_has”属性上,并将工具 key 添加到分发订单中。如果出现任何问题,我需要删除所有以前写入的“who_has”属性。
我认为 Transcastions 是做到这一点的方法。这是我的代码
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:在单个事务中对太多实体组进行操作。
显然,每个 tool.put()
都被视为一个实体组。我如何将它们联合到一个组中?
我尝试过文档,但对我来说都是中文的。你能解释一下我的例子吗?
最佳答案
您正在使用跨组 (xg=True
) 交易,即 limited to 5 entities participating in the transaction 。
实体组由 ancestor path 定义:这仅仅意味着对于特定实体(或多个实体),您定义父实体,并且对于该父实体,您可以再次定义父实体,基本上定义实体树。所有这些实体都属于同一实体组。组的根是树根处的实体:其他实体(直接或间接)定义为父实体的实体,但它本身没有定义父实体。
如果您没有定义实体的父实体,并且也不使用该实体作为其他实体的父实体,则该实体是它自己的实体组的根。
简化的基本原理:实体组基本上意味着“将所有实体放在同一台机器上”,以便 GAE 可以轻松地对它们进行事务更改。
限制是实体组(=实体组内的所有实体)每秒只能更新一次。因此,您需要小心如何构建数据。一种好的方法是使用用户作为实体组的根,因为用户行为独立并且往往不会在很短的时间内创建多个请求。
希望这能澄清一些问题。
关于python - ndb.transactional 如何对实体进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19995742/
我是一名优秀的程序员,十分优秀!