0

我正在Google AppEngine上編寫同步服務,但某些事情對我來說並不真正起作用。我想要做的是同步一個實體項目(也許它需要被持續,也許只是複製內容,誰知道),然後搜索一個項目類型的實體(可能與第一個項目一樣,但沒有' t需要)然後用它來同步任務。 所有這些都需要在事務中發生,所以如果任務同步失敗,該項目也會被刪除。AppEngine:無法從事務中的數據存儲中讀取持久數據

我寫了一些代碼行來簡單地測試和顯示出了什麼問題。 此代碼完美工作,並向我展示「找到項目」。

User user = userDao.findAll().get(0); 

    // Create a setup service... 
    Project project = new Project(); 
    project.setName("TEST ABC"); 
    project.setLastUpdated(new Date()); 
    project.setUser(user); 
    projectDao.persist(project); 

    Project persistedProject = projectDao.find("TEST ABC", user); 

    if (persistedProject == null) { 
     System.out.println("Project not found..."); 
    } else { 
     System.out.println("Project found!"); 
    } 

所以在這裏我不使用交易。但是,當我執行與交易的代碼:

User user = userDao.findAll().get(0); 

    Transaction tx = datastores.get().beginTransaction(); 

    // Create a setup service... 
    Project project = new Project(); 
    project.setName("TEST ABC"); 
    project.setLastUpdated(new Date()); 
    project.setUser(user); 
    projectDao.persist(project); 

    Project persistedProject = projectDao.find("TEST ABC", user); 

    if (persistedProject == null) { 
     System.out.println("Project not found..."); 
     tx.rollback(); 
    } else { 
     System.out.println("Project found!"); 
     tx.commit(); 
    } 

我總是看到「項目未找到...」。那麼,我到底能夠讀到一個我剛剛堅持下來的對象,但還沒有犯下呢?

順便說一句:我使用樹枝堅持2.0 RC1和最新的AE SDK(1.7)。

所以我的問題是我怎樣才能讀取持續在同一交易中的數據..?

回答

0

你不行。您應該重新閱讀GAE交易文檔。

簡而言之:事務內部的所有內容都可以獲得數據存儲的「快照」的一致視圖,因此新查詢不會顯示在查詢中。

但是,您擁有您堅持的項目對象,因此您應該使用該對象而不是查詢其中的一個。

如果您需要執行查詢,則需要手動將它與您在事務中創建的實體「加入」。

+0

據我所知,我正在處理數據存儲的快照,並且在另一個事務中添加的內容不會顯示在我的結果中。但它是有道理的,增加我在我的交易中做的查詢能夠在我自己的交易中... 手動加入,你的意思是創建一些緩存系統,當我做一個查詢,我手動掃描我的現金列表if任何對象符合?或者你的意思是別的? – dirkvranckaert

+0

不,作爲文檔狀態,哪個dragonx鏈接到上面,這不是快照隔離的工作方式。真正的問題是,爲什麼你想在一次交易中做到這一點? –

+0

通過手動「加入」我的意思是你可以搜索你的結果查詢列表,但首先手動添加新創建的實體。 – dragonx