2016-09-23 122 views
1

我正在編寫一個工作流Spring Boot Web應用程序,其中兩個人可以讀取相同的數據並進行更新。我用魔杖來處理使用Spring JPA的寫 - 寫衝突。如何處理服務層中的Spring JPA版本

舉例來說,price的初始值= 1000;用戶A和B從數據庫讀取價格 。現在用戶B更新價格價格= 1500。 後幾秒鐘,用戶A更新價格價格= 2000 - 這應該 因爲用戶A試圖寫入(更新)拋出一個異常 已經更新值由用戶B.

目前我已標記列version@Version在Spring JPA中的註釋。但我沒有得到如何使用它,而更新。

以下是我的代碼。

實體類

@Entity 
class Product{ 
@Version 
private int version; 

private String productName; 

private double price; 

/* Getters and Setters */ 
} 

春天JPA DAO

public interface ProductRepository extends JpaRepository<Product, Integer> { 
} 

服務類

public class ProductService{ 

@Autowired 
ProductRepository productRepo; 

@Transactional 
public void updateProductPrice(int id,double price){ 

Product p=productRepo.findOne(id); 
p.setPrice(price) 
    // This is where price is being updated and write-write conflict needs to be handled. 
    productRepo.save(p); 
} 

} 

任何人都可以幫助我使用任何可以使用的Spring API。考慮到有一個@Version列。任何幫助,將不勝感激。謝謝

+3

[使用Hibernate和Spring實現樂觀鎖定]可能的重複(http://stackoverflow.com/questions/19454003/implementing-optimistic-lock-using-hibernate-and-spring) –

+0

http://stackoverflow.com/a/19456821/1356423和http://stackoverflow.com/a/30101542/1356423 –

+0

如果我理解正確,您正在尋找一種方法來防止寫入,如果值被覆蓋(在您的情況下的價格)沒有與最初閱讀的價值相同的價值。另外,在讀和寫之間可能存在顯着的滯後(秒,分鐘等),並且多個用戶不必同時執行寫入。如果這是正確的,那麼您沒有看到併發寫入方案,因此默認的JPA樂觀鎖定(由'@ Version'提供)不會對您有所幫助。您可以嘗試使用舊版價格作爲'@版本'欄。 – manish

回答

0

你試圖實現的是所謂的樂觀鎖定。有兩種不同的方式來確保當前實體只能被一個資源訪問或修改,樂觀和悲觀的鎖定。

這些是位更高級的主題,所以你做決定哪一個更適合你的應用程序(但經驗法則是使用樂觀鎖時,你不要指望多次碰撞)之前,我建議你繼續閱讀。見tutorial或Spring Data優秀documentation

+0

謝謝。但是這種方法適用於併發寫入。我爲併發寫入實施了樂觀鎖。請考慮2次寫入之間有秒/分鐘間隔的情況。 – Mansoor

+0

這是什麼問題?秒用戶事務提交時應該發生異常。 –

+0

更正,第二個用戶事務提交時應發生異常。考慮到這一點,讀取將在單獨的用戶GET請求中發生,並且當用戶更新時,發出新的POST請求。 – Mansoor

相關問題