最近再看項目代碼,發現很多的service裏面,喜歡在事務內部再去調用HTTP請求,簡單分析下此種方式的利弊與解決策略。
概述
在數據庫內部嵌套TCP連接(一般是HTTP調用或是RPC遠程調用)。
@Transactional(rollbackFor = Exception.class)
public Boolean inviteUser(..){
// service 調用
userService.add(..);
// HTTP調用
httpClient.post(..,20)
}
優點:
- 保障兩個操作間的原子性、隔離性。
- 事務控制: 建立TCP連接可以使數據庫管理系統更好地控制和監視事務。它可以跟蹤連接的狀態和事務的執行進度,從而更容易實現事務管理和恢復。
- 性能優化: 內部TCP連接可以針對特定的事務進行性能優化。例如,可以爲事務分配更多的系統資源,以提高其執行速度。
- 安全性: 內部TCP連接可以通過加密和認證來增強安全性,確保只有授權的用戶或應用程序能夠訪問數據庫
弊端:
- TCP連接可能會超時,導致事務變成長事務。
- 網絡抖動出現異常,可能會導致前一個正常的操作回滾。
- 資源消耗: 每個TCP連接都需要消耗系統資源,包括內存和處理能力。在高負載情況下,內部建立TCP連接可能導致資源耗盡,影響其他事務的執行。
- 連接維護開銷: 維護大量的TCP連接可能會增加數據庫管理系統的開銷。每個連接都需要管理、維護和監視,這可能會導致性能下降。
- 複雜性: 內部TCP連接引入了更復雜的架構,需要更多的管理和維護工作。這可能需要更多的開發和管理工作,並增加了系統的複雜性。
- 連接延遲: 建立和維護TCP連接需要時間,這可能會導致事務的啓動延遲。對於需要快速響應的事務,這可能是一個不利因素。
解決方案
評估審視多個操作調用之間是否有強一致性。
- 有強一致性
必須手動開啓事務,根據HTTP調用的返回碼進行手動事務提交或回滾。事務傳播級別,儘量使用當前事務。
- 無強一致性
手動開啓事務,或是使用自動事務註解,但最後可以通過事件監聽器回調事務接口的afterCommit
方法,再進行HTTP調用。事務傳播級別,儘量使用當前事務。