簡體   English   中英

我的代碼的並發控制

[英]Concurrency Control on my Code

我正在開發訂單捕獲和生成器應用程序。 應用程序可以與同時處理不同訂單的並發用戶一起正常工作。 當來自不同系統/位置的兩個用戶嘗試以相同的順序工作時,問題開始。 它對業務的影響是,對於同一訂單,由於兩個用戶同時處理該訂單,因此應用程序將生成重復數據。

我試圖在生成訂單的地方同步該方法,但這將意味着沒有其他用戶可以處理任何新訂單,因為同步將對該方法放置一個鎖。 當然,這將阻止所有用戶在處理一個訂單時生成新訂單,因為它將命中同步代碼。

我還嘗試過對訂單進行標准初始化,但沒有成功。

誰能建議一個正確的方法? 歡迎所有建議/評論。 提前致謝。

您可以對代碼塊使用塊級同步,而不是在方法級別進行同步,這些代碼塊一次只能由一個線程操作。 這樣,您可以擴大相同訂單的並行處理范圍。

大規模地,如果您要備份數據庫中的實體,建議您考慮樂觀鎖定。

將版本字段添加到您的訂單實體。 下訂單(第一次)后,版本為1。因此,每次更新都應以此順序進行,因此,請設想兩個后續的並發過程

a -> Read data (version=1)
     Update data
     Store data (set version=2 if version=1)

b -> Read data (version=1)
     Update data
     Store data (set version=2 if version=1)

如果這兩個處理是並發的而不是序列化的,您會注意到其中一個進程確實無法存儲數據。 那就是失敗的用戶,他將不得不重試他的編輯。 (他改為讀取version = 2)。

如果使用JPA,樂觀鎖定就像向模型添加@Version屬性一樣容易。 如果使用原始JDBC,則需要將添加添加到更新條件中

update table set version=2, data=xyz where orderid=x and version=1

到目前為止,這是解決您的一般問題的最佳方案,實際上是首選方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM