【发布时间】:2014-05-29 06:33:40
【问题描述】:
我在 ndb.Model 类中归结为这些辅助方法:
@classmethod
@ndb.transactional(retries=2)
def new(cls, *args, **kwargs):
internal_name = kwargs['internal_name']
new_company = cls.get_or_insert(internal_name, **kwargs)
new_company.put()
return new_company
@classmethod
@ndb.transactional(retries=2)
def get(cls, internal_name):
result = cls.query(cls.internal_name == internal_name)
if result.count() != 1:
raise Exception("this is a problem");
return result.get()
我写了一个测试来验证我的假设:
def testCanCreateRetrieveCompany(self):
company = self.models.Company.new(internal_name="google", description="search engine")
reread_company = self.models.RichCompany.get("internal_name")
self.assertTrue(True)
但是,每次都失败并出现this is a problem 异常!
但是,如果我将测试更改为:
def testCanCreateRetrieveCompany(self):
company = self.models.Company.new(internal_name="google", description="search engine")
company.put()
reread_company = self.models.RichCompany.get("internal_name")
self.assertTrue(True)
这似乎过去了。我完全不知道为什么当第一个没有时它会通过。此外,删除 @ndb.transactional 运算符似乎可以完成这项工作。除了我显然希望这是事务性的。
不知道发生了什么。我知道文档中有关于事务读取的警告(只看到事务的原始读取状态),但我不知道写入有任何此类警告。有人有什么见解吗?
【问题讨论】:
标签: google-app-engine transactions app-engine-ndb