如何在事务中读取我刚写的实体?

时间:2012-10-04 04:21:59

标签: python google-app-engine google-cloud-datastore

我使用的是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完全相同的代码,但这次所有内容都在同一个事务中运行。如您所见,按键读取实体将返回None。执行祖先查询会返回0次点击。

我的问题是:如何在交易中读取我刚写的实体?或者这不可能吗?

感谢。

2 个答案:

答案 0 :(得分:4)

你做不到。事务内部的所有数据存储读取都显示事务启动时数据存储的快照。写作没有出现。

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

答案 1 :(得分:1)

嗯,有时候重读是非常有帮助的。业务规则可能由实体更新触发,需要重新加载。无线电通信局通常不知道触发它们的原因,也无法立即访问新实体。

对于Python不知道但是,在使用Objectify的Java中,Objectify会话(事务)缓存在事务中使更新可见。如果您正在使用的Python持久性框架中存在类似会话缓存的内容,那么这可能是一种解决方案。