Как транзакции влияют на согласованность чтения для следующего запроса, не являющегося предком в NDB - PullRequest
2 голосов
/ 24 марта 2012

Фаза применения сохранения может завершиться ошибкой и / или все еще выполняется асинхронно перед следующим не строго согласованным запросом чтения - без предка.

На основе локального тестирования статья Я написал тест, который должен симулировать несогласованные чтения:

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()

Актуальные вопросы…

  1. Меняет ли перенос put() в поведении транзакции описанное в начале? Нужен ли мне строго согласованный запрос, чтобы убедиться, что прочитанный текст был написан в txn? (тесты показывают, что мне все еще нужен строго согласованный запрос)

  2. Считается ли key.get() строго последовательным? (тесты показывают, что это так)

ОБНОВЛЕНИЕ

Я обновил тестовый код, как упоминал Гвидо, теперь все тесты пройдены:

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

1 Ответ

4 голосов
/ 24 марта 2012

Я считаю, что вы должны что-то сделать, чтобы активировать политику. Это объяснило бы неудачи теста. Кроме того, я считаю, что затрагиваются только запросы, а одинокий заказ фактически является транзакцией. Наконец, остерегайтесь кэшей NDB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...