2013-02-23 57 views
0

我有兩個應用程序使用相同的庫來處理數據庫。第一個應用程序是桌面,第二個應用程序是web。所以他們都可以在我的數據庫(PostgreSql)中同時更改相同的記錄。庫使用此代碼:JPA EntityManager默認合併行爲

//it doesnt use em.getTransaction() 
em.merge(userAcc);//change useraccount 

此代碼是否會導致死鎖?什麼是合併的默認行爲?合併使用內部交易嗎? 其實兩個合併操作的順序並不重要。

回答

1

Java Persistence wikibook的相關報價。

從技術角度講,在JPA中,EntityManager從創建點開始處於事務中。所以開始有點多餘。在開始被調用之前,某些操作(如persist,merge,remove)不能被調用。查詢仍然可以執行,並且查詢的對象可以更改,雖然這有點不明確,但JPA規範中的這些更改會發生什麼,通常它們會被提交,但最好在對您的任何更改做出更改之前調用begin對象。

因此,看起來在這種情況下,merge()的行爲將取決於您的持久性提供程序。

無論如何,我猜實體會在隱式事務中得到更新,但我認爲這不會導致死鎖。最糟糕的情況是,從兩個應用程序對同一實體的併發更新將在不知情的情況下相互覆蓋。你可以通過使用樂觀鎖定來防止這種情況。

+0

因此,如果它使用當前隔離級別內的事務。 – bossman 2013-02-23 18:40:11

+0

JPA規範沒有定義默認隔離級別。它將由底層數據庫和持久性提供者決定。 – zagyi 2013-02-23 18:52:02