2012-07-09 28 views
0

這是一個簡單的問題可能是em.flush數據通過SQL開發人員不可見

在我的代碼

我做了

user = em.find(User,pk); 
user.setName("name"); 
em.flush(); 

這種沖洗後()statemenet使用調試器停止使用斷點。我現在檢查使用我的SQL開發人員工具來查看是否在數據庫中進行了更改。我沒有看到在數據庫中完成的更改。

這對flush命令意味着什麼。

  1. 由flush生成的sql將被髮送到數據庫,但隨後在數據庫中排隊等待commit語句通過?和SQL語句不適用?

修改1: 所以可能是我沒說清楚第一次爲我所試圖做的

我有一個羣集的設置,其中在節點1:在交易1一個我正在改變一些參數,比如說用戶實體的名稱,並對它們進行刷新(),這樣你就可以訪問數據庫。我不能做一個提交,因爲有很多其他操作需要在事務中發生

與此交易1中的節點(機器)2並行,我正在獲取用戶實體。現在在這個交易中,唯一的願望是檢查用戶的最新名字。 這是平行的,我需要做的事情。 有人可以讓我知道如何做到這一點,使分佈式節點看到最新的變化。

Node 1          Node 2 
try{          try { 
    em.getTransaction.begin     em.getTransaction.begin 
    user = em.find(User,pk); 
    System.out.println.(user.getName()) 
    /* this prints JERRY*/ 
    user.setName("TOM"); 
    em.flush(); 
    ... 
    ...          user = em.find(User,pk); 
              System.out.println.(user.getName()) 
              /*This should print TOM*/ 

    ... 
    em.commit()        //no commit in this transaction 
} catch (Exception e) {     } finally { 


    //rollback         } 
} finally { 

} 
+1

閱讀關於事務隔離級別 – DataNucleus 2012-07-09 06:31:08

+0

你想要使用Read Uncommitted(http://stackoverflow.com/questions/2471055/why-use-a-read-uncommitted-isolation-level)但我必須建議你不想這樣做。我強烈建議你找出一些組織代碼的替代方法,這樣你可以部分地提交單個工作單元,而無需長時間運行阻塞事務。讀取未提交的內容可能是一個醜陋的曲目,除非您準備好了後果。 – jjathman 2012-07-10 02:09:28

回答

0

您很可能是正確的,您的交易尚未完成,因此更改在持續存在的交易以外不可見。你用什麼來啓動和停止你的交易?

+0

嗨plese看到修改解釋我試圖實現。謝謝。 – user804979 2012-07-10 01:59:23

0

flush()不提交事務,只寫入數據庫。要查看另一個會話中的更改,您需要提交事務。