2017-04-18 160 views
0

雖然這個問題看起來很基本,但是我的場景與其他帖子@stackoverflow完全不同。我使用JPA &運動衫(REST)實現彈簧。每當我打2個請求同時從捲曲到我的Java REST方法以更新數據庫資源,首先請求被成功執行,但第二個請求被失敗,樂觀鎖定異常:如何讓線程等到另一個線程完成該方法執行

javax.persistence.OptimisticLockException:異常 [ EclipseLink-5006](Eclipse持久性服務 - 2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.OptimisticLockException異常 說明:該對象無法更新,因爲它已更改,或者自上次讀取以來已刪除 。

我已經嘗試把更新後的代碼放在同步塊中,但它沒有奏效。

我也試過聲明rest方法是同步的,但沒有工作。

現在我想讓我的方法被第一個請求執行,並希望第二個請求等到第一個請求完成它的執行。

我已經實現了這個使用static變量,但不想使用static由於代碼標準的變量。

有人可以給這個有效的解決方案嗎?

+1

使用synchronized執行同步塊內的數據庫操作應該工作,只要你同步上同一個實例。提供有關您用作鎖的更多細節以及您如何使用它。 – erickson

+0

什麼持久性告訴你,你的第二次更新有第一次更新的比賽(根據你的問題,這是真的)。因此,無論哪個更新第二次到達內部持久化的同步塊,都沒有看到第一個更新,並且因爲它們兩個的更新實體是相同的,所以第二次更新被拒絕,因爲它的數據是「過時的」。在這種情況下,理想情況下應該執行的操作是清除陳舊請求,並使用更新的實體重新啓動它,然後再次嘗試更新。 –

+0

你有映射類中有相應表列的'@ Version'字段嗎? – eg04lt3r

回答

0

在數據庫調用之前使用同步將有所幫助。使用synchronized關鍵字

synchronized(this){ 
//process 
} 

2)另一種選擇

1)爲前方法名

synchronized void <method(){ 
//process 
} 
相關問題