我创建了一个测试Web应用程序来测试Entities
的persist-read-delete,我创建了一个简单的循环来持久化Entity
,检索并修改它然后将其删除100次。
在循环的某个时间间隔没有问题,但是有一些错误,Entity
已经存在,因此无法持久存在(我添加的自定义异常处理)。
同样在循环的某个时间间隔,Entity
无法修改,因为它不存在,最后在某个时间间隔内Entity
无法删除,因为它不存在。
我知道循环可能太快,以至于Appengine
数据存储区的操作尚未完成。因此,在尝试访问它或删除操作时导致Entity does not exist
之类的错误尚未完成,因此无法创建具有相同ID
的实体,等等。
但是,我想了解如何处理使用Entity
进行并发操作的这种情况。
答案 0 :(得分:1)
根据我的理解,你做的事情如下:
for i in range(0,100):
ent = My_Entity() # create and save entity
db.put(ent)
ent = db.get(ent.key()) # get, modify and save the entity
ent.property = 'foo'
db.put(ent)
ent.get(ent.key()) # get and delete the entity
db.delete(my_ent)
进行一些错误检查以确保您有要删除,修改的实体,并且您遇到了一堆关于查找要删除或修改的实体的错误。如你所说,这是因为不能保证按顺序执行调用。
但是,我想了解如何处理这种与实体进行并发操作的情况。
您最好的选择是批量执行您为实体持久化所做的任何修改。例如,如果您要创建/保存/修改/节省或修改/保存/删除尽可能尝试组合这些步骤(即创建/修改/保存或修改/删除)。这不仅可以避免您看到的错误,还可以减少您的RPC。遵循这一策略,上述循环将减少为......
prop = None
for i in range(0,100):
prop = 'foo'
换句话说,对于任何需要设置/删除的东西,只需使用局部变量即可。那是GAE给你的答案。在弄清楚所有快速的东西后,你无法在实体中保留这些信息。
除此之外,您无能为力。如果您需要确保一组实体一起更新,Transactions可以帮助您,但如果您尝试将多个内容同时添加到一个实体,则无法提供帮助。
编辑:您还可以查看pipelines API。