簡體   English   中英

兩個線程編寫同一實體的不同字段

[英]Two threads writing different fields of same entity

我有以下情況。

一個業務實體(BE)由2個線程異步提供的2個部分組成。 示例:我們的BE具有字段id和A,B,C-全部在數據庫的一個表中。 當實體存儲到數據庫中時,Id是按順序生成的。 B是唯一字段,數據庫中對此有約束。 Process1提供了字段A和B。Process2提供了字段B和C。因此,在兩個過程完成之后,我們應該在表中的一行中填滿所有列。

進行這項工作的好方法是什么?

現在做什么:

在每個過程中,我們首先從表中選擇所有值,其中B列中的值就是現在的值。 (如果有的話-這意味着其他進程已經保存了它的一部分)。 如果有的話,它會隨着缺少的列而豐富並持續存在。 如果什么都沒有-我們只是堅持我們擁有的。 但是,盡管所有這些都完成了,但是有可能另一個進程完成了它的工作,並且當我們保留實體時,我們會得到ConstraintViolationException並將休眠事務標記為回滾。 並且缺少的列仍然丟失。

您首先必須決定如何處理沖突。 為此,請回答以下問題:

如果在進程2運行時進程1更改了您的實體,則2的結果仍然有效嗎? 還是應該重新運行?

如果進程1更新了字段B,則進程2在運行時應該覆蓋進程2嗎? 還是只保留過程1的價值?

當然,問題也應該通過1和2互換來回答。

如果以某種方式實施流程,使他們采用原始實體,並產生一個新的修改過的實體並以其開始,那么您可以有一個隊列,其中添加了所有這些結果,並且有一個流程將這些更改應用於數據庫。

在特定情況下,可能有更簡單的方法,但這是我在問題中描述的最一般情況下建議的方法。

我會這樣

  • 在啟動線程之前加載或創建實體
  • 啟動線程並將其分配給每個線程
  • 在兩個線程中更新它
  • 當兩個都完成保存到數據庫

暫無
暫無

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

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