2010-10-21 67 views
0

可能重複:
concurrency (stale data) problem in JPA併發問題JPA和JTA

對不起重複,但我想我沒有得到滿意的答案,所以發帖再次 比方說,我有方法具有以下簽名

Object getData(int id) { 
    //create a entity manager 
    //get data frm db 
    //return data 
} 

updateData() { 
    Object obj = getData(id) 
    //get entity manager 
    //start transcation tx 
    //update 
    //commit tx 
} 

,現在會導致併發我ssue?數據可能在最壞的情況下陳舊?例如。 如果我getData並由我更新的時間,如果有人更新數據將我的updateData有陳舊的數據? 現在我可以使用以下內容:我會解決問題嗎?

Object getData(int id,Entitymanager em) { 

     //get data frm db using em 
     //return data 
    } 

updateData() { 
     Object obj = getData(id) 
     //get entity manager em 
     //start transcation tx 
     //getdata using getData(id,em) 
     //commit tx 
    } 
+0

在同一個物體上的兩個不同的EM可能不是一個好主意。 – Qwerky 2010-10-21 15:31:41

+1

如果你沒有得到滿意的答案,讓人們知道他們爲什麼不滿意,或許可以澄清你的問題。發佈相同的問題無濟於事,需要處理。投票結束。 – 2010-10-21 19:51:20

+0

是的,請僅編輯原始問題而不是發佈重複。編輯會將其返回到「活動」頁面的頂部,因此它將獲得更多視圖。 – 2010-10-21 20:17:18

回答

0

如果兩個單獨的請求同時訪問updateData(),則可能會得到過時的數據。您可以通過鎖定updateData()中提取的數據來處理過期問題。如果您正在使用Hibernate作爲JPA提供者,你可以按如下鎖定數據:

updateData() { 
    Object obj = getData(id); 
    Session session = (Session) em.getDelegate(); 
    session.refresh(obj, LockMode.UPGRADE); 
} 

刷新是必要的,因爲它可能發生在取和updateData另一個事務完成數據的鎖定之間。

請注意,getDataupdateData中使用的實體管理器必須相同。