2011-04-21 26 views
2

我們有做約以下服務方法:Spring:使用事務DB方法處理長時間運行的Web服務調用的最佳方法?

@Transactional 
public void serviceMethod(...){ 
    for(Item i : bunchOfItems){ 
     webServices.webServiceCall(...); 
     dao.daoUpdateMethod(...); 
    } 
} 

的問題是,一旦發生更新的DB是持有鎖在桌子上交易的持續時間(web服務每次平均調用5秒)。當然,webservice調用或DAO調用中的任何異常都應該導致完全回滾。

什麼是這種情況,最好的辦法?

+1

爲什麼會更新鎖定整個表?在任何體面的DBMS中,它只會鎖定更新的行。 – 2011-04-21 08:25:41

+1

這個問題與Spring沒有關係,它是一個通用的問題。 – Ralph 2011-04-21 08:47:57

回答

0

通過在數據庫中使用MVCC模式,我可以避免完全鎖定更新。這樣做後,我可以執行相同的測試,而不會發生任何鎖爭用。

MVCC模式允許讀取而未提交的更新仍在進行中發生。

3

如果Web服務調用不依賴於你可能在以前的迭代中已經更新了,你能在第一次通過所有的Web服務調用,並收集在內存中的結果,然後啓動一個事務的所有你的更新。這會讓你的交易變得更短,因爲我認爲Web服務調用不是事務性的,它不會影響數據的一致性。

2

因爲我假定Web服務調用以任何方式不是事務性的,你可以做所有的web服務,你開始交易來存儲的東西之前調用。

你可以做整個東西以不同的方式:

  • 順序 - 2個迴路,一個交易,有點記憶:環槽的所有Web服務調用存儲在數組中的結果,打開事務,然後循環槽的所有結果,並將其儲存
  • 順序 - 一個迴路,和n交易:在循環中,首先調用Web服務的一個項目,然後開始一個新的事務,並將其存儲(循環結束)平行
  • - DO Web服務並行調用 - 您可以將它與上面提到的兩種方式結合使用like JB Nizet suggested his answer
相關問題