2016-12-14 70 views
1

我的問題。 我有一個簡單的表,令牌。它只有幾個屬性。 id,令牌,用戶名,版本和expire_date。 我有一個將創建或更新令牌的休息服務。因此,當用戶請求令牌時,我想檢查用戶(使用用戶名)是否已經有條目,如果是,則只需更新expire_date並返回,如果沒有條目創建新條目。問題是,如果我創建了一個測試用幾個併發用戶(使用Jmeter腳本),這稱爲休息服務,休眠將非常快地拋出一個StaleObject異常,因爲會發生什麼是:線程A將爲用戶選擇行,改變expire_date,碰撞版本,同時線程B會做同樣的事情,但實際上會在線程A提交之前提交。現在當線程A將提交hibernate檢測到版本更改並將拋出異常和回滾。所有作品都按文件記錄如何使用休眠創建線程安全插入或更新(處理樂觀鎖定)

但我想要發生的是,線程B將等待線程A完成之前完成它的事情。

解決此問題的最佳方法是什麼?我應該使用java併發包並實現鎖定嗎?或者是實現自定義jpa隔離級別的更好選擇?

感謝

回答

0

如果您正在使用JEE服務器,EJB容器會做它,你使用@Singleton的。

0

我認爲最好的方法是使用JPA鎖來獲取當前正在更新的資源(行鎖)的鎖定。不要用你自己的努力來使用java併發來實現行鎖定。例如:在dbms級別中鎖定包含用戶「john.doe」的行將更容易,而不是尋找在您的代碼中使用併發鎖定特定行的方式。