[英]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服務調用。
您可以用不同的方式完成全部工作:
通過在數據庫中使用MVCC模式,我可以避免完全鎖定更新。 完成此操作后,我可以執行相同的測試而沒有任何鎖爭用。
MVCC模式允許在未提交的更新仍在進行時進行讀取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.