我正在使用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正在運行一個執行寫操作的事務。然後,它運行第二個事務,它執行兩次讀取,一次是按鍵,另一次是祖先查詢。在這種情況下閱讀工作很好。
Test2運行與test1完全相同的代碼,但是這次所有內容都在相同的事務中運行。如您所見,按鍵讀取實體返回無。做一個祖先查詢返回0命中。
我的問題是:我如何在一個事務中讀取我剛剛寫的一個實體?或者這是不可能的?
謝謝。
謝謝,非常明確的答案。 –
另請注意,如果您使用的是NDB(您應該:-)並且針對特定的寫入和讀取操作啓用了上下文緩存,您將*讀取您寫入的內容 - 從上下文緩存。 (但NDB不會從事務中的memcache中讀取。) –