Google app engine 事务如何影响NDB中下一个非祖先查询的读取一致性

Google app engine 事务如何影响NDB中下一个非祖先查询的读取一致性,google-app-engine,Google App Engine,在下一个非强一致读取非祖先查询之前,and/or仍在异步执行 基于本文,我编写了一个测试,该测试应模拟不一致的读取: import dev_appserver dev_appserver.fix_sys_path() import unittest from google.appengine.ext import ndb from google.appengine.ext import testbed from google.appengine.datastore import datast

在下一个非强一致读取非祖先查询之前,and/or仍在异步执行

基于本文,我编写了一个测试,该测试应模拟不一致的读取:

import dev_appserver

dev_appserver.fix_sys_path()

import unittest
from google.appengine.ext import ndb
from google.appengine.ext import testbed
from google.appengine.datastore import datastore_stub_util

class SomeModel(ndb.Model):
    pass

class SingleEntityConsistency(unittest.TestCase):
    def setUp(self):
        # Setup AppEngine env
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=0)
        self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
        self.testbed.init_memcache_stub()
        # A test key
        self.key = ndb.Key('SomeModel', 'test')

    def tearDown(self):
        self.testbed.deactivate()

    def test_tx_get_or_insert(self):
        p = SomeModel.get_or_insert('test')
        self.assertEqual(0, SomeModel.query().count(1), "Shouldn't be applied yet")
        self.assertEqual(1, SomeModel.query(ancestor=self.key).count(1), "Ancestor query read should be consistent")

    def test_no_tx_insert(self):
        p = SomeModel(id='test')
        p.put()
        self.assertEqual(0, SomeModel.query().count(2), "Shouldn't be applied yet")
        self.assertEqual(1, SomeModel.query(ancestor=self.key).count(1), "Ancestor query read should be consistent")

    def test_with_ancestor(self):
        p = SomeModel(id='test')
        p.put()
        self.assertEqual(p, SomeModel.query(ancestor=self.key).get())

    def test_key(self):
        p = SomeModel(id='test')
        p.put()
        self.assertEqual(p, self.key.get())

if __name__ == '__main__':
    unittest.main()
实际问题…

  • 在事务中包装
    put()
    是否会改变开头描述的行为?我是否仍然需要一个强一致性的查询,以确保我将读取的数据是在txn中编写的?(测试表明,我仍然需要强一致性查询)

  • key.get()
    是否被认为是强一致的?(测试表明,确实如此)

  • 更新

    我已经更新了Guido提到的测试代码,现在所有测试都通过了:

    self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
    

    我相信你必须采取一些措施来激活这项政策。这可以解释测试失败的原因。此外,我认为只有查询会受到影响,单独看跌期权实际上是一项交易。最后要小心NDB的缓存。

    我相信您必须采取措施激活策略。这可以解释测试失败的原因。此外,我认为只有查询会受到影响,单独看跌期权实际上是一项交易。最后要注意NDB的缓存。

    如果一个单独的put实际上是一个事务,这是否意味着同一实体组中的所有put都在一个锁上序列化?如果一个单独的put实际上是一个事务,这是否意味着同一实体组中的所有put都在一个锁上序列化?