我有一個Web服務和幾個後臺運行的異步服務(用於長時間運行的數據收集過程),它們使用相同的DAO庫和共享數據源。使用Spring JDBC模板實現的DAO庫。 RDBMS是PostgreSQL。
當Web服務和異步服務通過DAO同時修改一個表中的相同行並且我有不一致的數據時,這並不罕見。
例如我有一個實體中的「狀態」字段,其值可以爲:1-付費,2-未付。
有時我有這樣的情況:如何處理Web服務中的併發數據修改混亂和合並(樂觀/悲觀鎖定)?
- 交易#1:web服務正在修改從 1至2中的 「狀態」 的值與ID到行= 1
- 交易#2:在同一時間異步服務是抓住一些端點一些 數據和修改行的另一場與ID = 1,但「狀態」欄檻保持1.它不知道,「狀態」值從1變在交易#1中爲2。
因爲我有「國家」等於1,但它必須是2.它也有爭議。有時候異步服務會改變「狀態」字段,Web服務不知道這個改變,並再次造成數據混亂。當然,這不僅發生在國家領域。
我有兩個選擇:
- 使用悲觀SELECT ... FOR UPDATE。
但它不適合我 ,因爲Web服務通常會從表中獲取部分行。它 不能等待很長時間,而異步服務持有 鎖定,因爲這裏的性能至關重要。 - 使用樂觀鎖定。 「版本」字段等。
但是我不能只是在樂觀鎖定失敗的情況下回滾 更改,因爲必須合併此更改 。有時候我不能重複操作,因爲另一個系統中的原子操作不屬於spring jdbc事務。
可能存在一些模式來處理這樣的情況下,合併數據?
謝謝
伊萬
這是不完全重複的,因爲這個問題是關於一個長期運行的操作對同一數據庫的多個短的問題,。這一點是**沒有**由另一個問題或其答案解決。 – 2014-09-16 06:14:21