2012-10-04 81 views
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正在運行一個執行寫操作的事務。然後,它運行第二個事務,它執行兩次讀取,一次是按鍵,另一次是祖先查詢。在這種情況下閱讀工作很好。

Test2運行與test1完全相同的代碼,但是這次所有內容都在相同的事務中運行。如您所見,按鍵讀取實體返回無。做一個祖先查詢返回0命中。

我的問題是:我如何在一個事務中讀取我剛剛寫的一個實體?或者這是不可能的?

謝謝。

回答

1

那麼,有時候重讀它真的很有幫助。業務規則可能由實體更新觸發,並需要重新加載。無線電通信局通常不知道觸發它們的是什麼,也不會立即訪問新的實體。

不知道Python,但在使用Objectify的Java中,更新通過Objectify會話(事務)緩存在事務中變得可見。如果在您正在使用的Python持久性框架中存在類似會話緩存的內容,那可能是一個解決方案。

4

你不行。事務內部的所有數據存儲讀取都會在事務啓動時顯示數據存儲的快照。寫入不顯示。

從理論上講,你不應該閱讀,因爲你將有一個你寫的每個實體的實例。使用該實例。

+0

謝謝,非常明確的答案。 –

+0

另請注意,如果您使用的是NDB(您應該:-)並且針對特定的寫入和讀取操作啓用了上下文緩存,您將*讀取您寫入的內容 - 從上下文緩存。 (但NDB不會從事務中的memcache中讀取。) –

相關問題