0

我正在使用 Python2.7、GAE 和 High Replication 数据存储。我正在尝试执行一个事务,该事务首先写入一个实体然后读取它,但读取从未找到实体。这是我的一个测试用例:

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 正在运行一个执行写入的事务。然后它运行第二个事务,执行两次读取,一次通过键读取,一次通过祖先查询。在这种情况下,读取工作得很好。

Test2 运行的代码与 test1 完全相同,但这次一切都在同一个事务中运行。如您所见,按键读取实体返回无。执行祖先查询返回 0 个命中。

我的问题是:如何在事务中读取我刚刚编写的实体?或者这是不可能的?

谢谢。

4

2 回答 2

4

你不能。事务内的所有数据存储读取都显示事务启动时数据存储的快照。写不出来。

从理论上讲,您不必阅读,因为您将拥有您写入的每个实体的实例。使用该实例。

于 2012-10-04T05:01:30.487 回答
1

嗯,有时候重读真的很有帮助。实体更新可能会触发业务规则,并且需要重新加载它。BR 通常不知道是什么触发了他们,也无法立即访问新实体。

不知道 Python,但在使用 Objectify 的 Java 中,更新在事务中通过 Objectify 会话(事务)缓存可见。如果您正在使用的 Python 持久性框架中有会话缓存之类的东西,那可能是一个解决方案。

于 2012-10-04T15:54:58.207 回答