我使用的是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次点击。
我的问题是:如何在交易中读取我刚写的实体?或者这不可能吗?
感谢。
答案 0 :(得分:4)
你做不到。事务内部的所有数据存储读取都显示事务启动时数据存储的快照。写作没有出现。
理论上,您不必阅读,因为您将拥有您所写的每个实体的实例。使用该实例。
答案 1 :(得分:1)
嗯,有时候重读是非常有帮助的。业务规则可能由实体更新触发,需要重新加载。无线电通信局通常不知道触发它们的原因,也无法立即访问新实体。
对于Python不知道但是,在使用Objectify的Java中,Objectify会话(事务)缓存在事务中使更新可见。如果您正在使用的Python持久性框架中存在类似会话缓存的内容,那么这可能是一种解决方案。