我正在編寫一個工作流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
列。任何幫助,將不勝感激。謝謝
[使用Hibernate和Spring實現樂觀鎖定]可能的重複(http://stackoverflow.com/questions/19454003/implementing-optimistic-lock-using-hibernate-and-spring) –
http://stackoverflow.com/a/19456821/1356423和http://stackoverflow.com/a/30101542/1356423 –
如果我理解正確,您正在尋找一種方法來防止寫入,如果值被覆蓋(在您的情況下的價格)沒有與最初閱讀的價值相同的價值。另外,在讀和寫之間可能存在顯着的滯後(秒,分鐘等),並且多個用戶不必同時執行寫入。如果這是正確的,那麼您沒有看到併發寫入方案,因此默認的JPA樂觀鎖定(由'@ Version'提供)不會對您有所幫助。您可以嘗試使用舊版價格作爲'@版本'欄。 – manish