0

Python2.7、GAE、および高レプリケーションデータストアを使用しています。最初にエンティティを書き込み、次にそれを読み取るトランザクションを実行しようとしていますが、読み取りによってエンティティが見つかりません。これは私が持っているテストケースです:

class DemoTestCase(unittest.TestCase):
  def setUp(self):
    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)

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

  def test1(self):
    db.run_in_transaction(self._write)
    db.run_in_transaction(self._read)

  def test2(self):
    db.run_in_transaction(self._write_read)

  def _write(self):
    self.root_key = db.Key.from_path("A", "root")
    a             = A(a=1, parent=self.root_key)
    self.a_key    = a.put()

  def _read(self):
    b = sample.read_a(self.a_key)
    self.assertEqual(1, b.a)
    self.assertEqual(1, A.all().ancestor(self.root_key).count(5))

  def _write_read(self):
    root_key = db.Key.from_path("A", "root")
    a     = A(a=1, parent=root_key)
    a_key = a.put()
    b     = sample.read_a(a_key)
    self.assertEqual(None, b)
    self.assertEqual(0, A.all().ancestor(root_key).count(5))

現在、両方のテストケースに合格しています。

Test1は、書き込みを実行するトランザクションを実行しています。次に、2つの読み取りを実行する2番目のトランザクションを実行します。1つはキーによるもので、もう1つは祖先クエリによるものです。この場合、読み取りは問題なく機能します。

Test2はtest1とまったく同じコードを実行していますが、今回はすべてが同じトランザクション内で実行されます。ご覧のとおり、エンティティをキーで読み取ると、Noneが返されます。祖先クエリを実行すると、0ヒットが返されます。

私の質問は、トランザクション内で、今書いたエンティティをどのように読み取ることができるかということです。それともこれは不可能ですか?

ありがとう。

4

2 に答える 2

4

できません。トランザクション内のすべてのデータストア読み取りには、トランザクション開始時のデータストアのスナップショットが表示されます。書き込みは表示されません。

理論的には、書き込むすべてのエンティティのインスタンスがあるため、読み取る必要はありません。そのインスタンスを使用します。

于 2012-10-04T05:01:30.487 に答える
1

そうですね、時々読み直すと本当に助かります。ビジネス ルールは、エンティティの更新によってトリガーされる可能性があり、再読み込みする必要があります。BR は多くの場合、何がトリガーになったかを認識しておらず、新しいエンティティにすぐにアクセスできません。

Python についてはわかりませんが、Objectify を使用する Java では、Objectify セッション (トランザクション) キャッシュによって、トランザクション中に更新が可視化されます。使用している Python 永続化フレームワークにセッション キャッシュのようなものがあれば、それが解決策になる可能性があります。

于 2012-10-04T15:54:58.207 に答える