簡體   English   中英

春季:處理帶有事務性數據庫方法的長期Web服務調用的最佳方法?

[英]Spring: Best way to handle long-running web-service calls with transactional DB methods?

我們有一種服務方法,可以大致執行以下操作:

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

問題在於,一旦發生更新 ,數據庫就會在事務持續時間內將保持在鎖上 (每個Web服務平均調用5秒)。 當然,Web服務調用或DAO調用中的任何異常都應引起完全回滾。

解決這種情況的最佳方法是什么?

如果Web服務調用不取決於您在上一次迭代中可能進行的更新,則可以在第一次通過時進行所有Web服務調用,並將結果收集在內存中,然后為所有更新啟動事務。 這將使您的事務變得更短,並且由於我假設Web服務調用無論如何都不是事務性的,因此不會影響您數據的一致性。

因為我假設Web服務調用絕不是事務性的,所以可以在開始事務存儲任何東西之前進行所有Web服務調用。

您可以用不同的方式完成全部工作:

  • 順序-2個循環,一個事務和一點內存:通過所有Web服務調用的循環將結果存儲在數組中,打開事務,然后循環通過所有結果並將其存儲
  • 順序-一個循環,和n個事務:在循環中,首先為一個項目調用Web服務,然后開始一個新的事務並存儲它(循環結束)
  • 並行-並行進行Web服務調用-您可以將其與上述兩種方式結合使用, 例如JB Nizet建議他的回答

通過在數據庫中使用MVCC模式,我可以避免完全鎖定更新。 完成此操作后,我可以執行相同的測試而沒有任何鎖爭用。

MVCC模式允許在未提交的更新仍在進行時進行讀取。

暫無
暫無

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

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