【數據庫事務、消息隊列事務、Redis 事務、Spring 事務 詳細分析】

數據庫事務、消息隊列事務、Redis 事務、Spring 事務** 的詳細分析

在分布式系統和應用開發中,事務管理是確保數據一致性和可靠性的關鍵機制。以下是針對?數據庫事務、消息隊列事務、Redis 事務、Spring 事務?的詳細分析,包括原理、特點、適用場景和對比總結。


1.?數據庫事務

原理
數據庫事務基于?ACID?特性(原子性、一致性、隔離性、持久性),通過事務日志(如 Redo Log、Undo Log)和鎖機制實現。
核心操作

  • BEGIN:開始事務
  • COMMIT:提交事務
  • ROLLBACK:回滾事務

隔離級別

  • 讀未提交(Read Uncommitted)
  • 讀已提交(Read Committed)
  • 可重復讀(Repeatable Read)
  • 串行化(Serializable)

分布式事務

  • 2PC(兩階段提交):協調者與參與者協作,但存在單點故障和阻塞問題。
  • TCC(Try-Confirm-Cancel):業務補償機制,通過預留資源實現最終一致性。
  • Saga 模式:長事務拆分為多個本地事務,通過正向操作和補償操作保證一致性。

適用場景

  • 傳統關系型數據庫(如 MySQL、PostgreSQL)的本地事務。
  • 跨庫或跨服務的分布式事務(需結合分布式事務框架如 Seata)。

2.?消息隊列事務

原理
消息隊列事務用于保證?消息生產者與消費者之間的數據一致性,常見實現方式:

  • 事務消息(如 RocketMQ):

    1. 發送半消息(Half Message)到 Broker,暫不對消費者可見。
    2. 執行本地事務(如數據庫操作)。
    3. 根據本地事務結果提交或回滾消息(Broker 確認消息是否投遞)。
    4. Broker 提供事務狀態回查機制,避免事務懸掛。
  • 最大努力通知(如 RabbitMQ):通過異步確認和重試保證最終一致性。

特點

  • 實現?業務邏輯與消息發送的原子性
  • 需要處理消息重復消費(需消費者冪等)。

適用場景

  • 異步解耦場景(如訂單創建后發送消息通知庫存系統)。
  • 分布式系統的最終一致性保證。

3.?Redis 事務

原理
Redis 事務通過?MULTIEXECDISCARDWATCH?命令實現,本質是?命令隊列的批量執行

  • MULTI:開啟事務,后續命令入隊。
  • EXEC:執行隊列中的所有命令。
  • DISCARD:取消事務。
  • WATCH:監控 Key,若被修改則事務失敗(樂觀鎖)。

特點

  • 不保證原子性:命令執行失敗后不會回滾(僅語法錯誤會取消事務)。
  • 無隔離性:事務執行期間其他客戶端命令可能被插入。

適用場景

  • 簡單的批量操作(如增減庫存、計數器)。
  • 結合 Lua 腳本實現復雜原子操作。

4.?Spring 事務

原理
Spring 通過?聲明式事務@Transactional?注解)和?編程式事務TransactionTemplate)管理事務,底層依賴事務管理器(如?DataSourceTransactionManager)。
核心機制

  • 事務傳播行為:如?REQUIRED(默認)、REQUIRES_NEWNESTED
  • 隔離級別:與數據庫隔離級別對應。
  • 回滾規則:指定哪些異常觸發回滾。

分布式事務支持

  • JTA(Java Transaction API):適用于跨多個資源(如數據庫、消息隊列)的全局事務。
  • 整合 Seata:通過 AT 模式、TCC 模式實現分布式事務。

適用場景

  • 單數據源事務管理(如操作單個數據庫)。
  • 微服務架構下的分布式事務(需結合其他框架)。

對比總結

特性數據庫事務消息隊列事務Redis 事務Spring 事務
原子性支持(ACID)最終一致性(事務消息)弱原子性(批量執行無回滾)依賴底層資源(如數據庫)
隔離性多級別隔離(如 RC、RR)無隔離性無隔離性與數據庫隔離級別一致
持久性強持久性(日志持久化)消息持久化(Broker 存儲)依賴配置(AOF/RDB)依賴底層資源
應用場景數據強一致性操作異步解耦與最終一致性簡單批量操作統一管理多種資源的事務
分布式支持需結合 2PC、TCC、Saga 等事務消息機制不支持支持(通過 JTA、Seata 等)

選型建議

  1. 數據庫事務:適用于強一致性要求的業務(如支付、訂單)。
  2. 消息隊列事務:適用于異步解耦和最終一致性(如通知、日志)。
  3. Redis 事務:僅用于簡單操作的批量執行,需結合 Lua 腳本保證原子性。
  4. Spring 事務:統一管理本地事務,分布式場景需結合 Seata、JTA 等框架。

常見問題

  1. Redis 事務為什么不支持回滾?
    Redis 的設計目標是高性能,回滾會增加復雜性和性能損耗,需開發者自行處理錯誤邏輯。

  2. 如何解決消息隊列事務與數據庫事務的一致性問題?
    使用?本地事務表?+?事務消息

    • 數據庫操作與消息寫入本地事務表在同一個事務中。
    • 后臺任務輪詢事務表,發送消息到 MQ 并刪除記錄。
  3. Spring 事務失效的場景?

    • 方法非?public
    • 自調用(未通過代理對象調用)。
    • 異常被捕獲未拋出。
    • 數據庫引擎不支持事務(如 MyISAM)。

通過合理選擇事務機制,可以在性能、一致性和開發復雜度之間找到平衡。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899206.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kubectl 命令參數詳解與示例

kubectl 命令參數詳解與示例 kubectl 是 Kubernetes 的命令行工具,用于與 Kubernetes 集群交互。下面我將詳細介紹 kubectl 的主要命令參數,并提供相應的使用示例。 一、基礎命令 1. kubectl get - 獲取資源信息 常用參數: -n, --namesp…

#vue中解決異步請求的競態

// composables/useFetchWithoutRace.js import { ref } from vue; import axios from axios;// 定義一個可復用的 Composition 函數,處理帶有競態控制的異步請求 export function useFetchWithoutRace() {// 定義響應式變量 latestRequestId,用于追蹤最…

如何在 Postman 中導入和導出 cURL 命令?

cURL 是一款廣受歡迎的命令行工具,專門用于執行 HTTP 請求。它在 Web 應用或 API 測試中極為實用,讓用戶得以借助在 API 開發者社區廣為流行的成熟語法,直接通過命令行與 API 進行交互。若你需要在多個環境下運行眾多 cURL 命令,可…

用python制作一個貪吃蛇小游戲

文章目錄 效果圖python源碼使用說明效果圖 只需要一百多行python代碼,就能制作一個貪吃蛇小游戲。效果如下: 操作說明: 你可以使用上下左右箭頭鍵來控制蛇的移動方向。蛇吃到食物后會變長,當蛇撞到墻壁或自己的身體時游戲結束。游戲結束后,你可以按 Q 退出游戲,或按 C…

react 15-16-17-18各版本的核心區別、底層原理及演進邏輯的深度解析

一、React 15(2016) 核心架構:Stack Reconciler(棧協調器) 工作原理: 同步遞歸渲染:采用深度優先遍歷方式遞歸處理 Virtual DOM,形成不可中斷的調用棧渲染流程:1. 觸發 …

微信小程序pdf預覽

1.示例圖 2.代碼 fileId:要預覽的pdf文件的id viewsFiles(fileId) {wx.showLoading({title: 加載中...});var params {url: "/common/getFile/" fileId ,//后端提供的接口method: "GET",responseType: "arraybuffer",callBack: …

雪花算法生成分布式唯一ID

雪花算法的結構是由時間戳、工作機器ID和序列號構成。要確保全局唯一,必須保證每個節點的機器ID唯一,并且同一毫秒內序列號不重復。在分庫分表的環境下使用雪花算法,機器ID的分配是關鍵。常見的做法是通過分布式系統協調,比如使用…

把手搭建vue前后端管理系統-TAB標簽通過pinia來進行管理(二十六)

目標&#xff1a;通過pinia的store來進行組件狀態的統一管理&#xff0c;這樣大家都可以共用到這個組件的狀態信息&#xff0c;就可以實現組件的聯動 一、添加側邊欄菜單的點擊事件&#xff1a; 1、CommonAside.vue里面添加click的事件 <el-menu-itemv-for"item in …

this(執行上下文)

&#x1f6a9; 這個專欄是一個 JS 進階系列&#xff0c;當前內容為 JS 執行機制&#xff0c;建議按順序閱讀 執行上下文&作用域 詞法環境&變量環境 this&#xff08;上下文對象&#xff09; &#x1f539; 概述 &#x1f30d; 前提概要&#xff1a; 在上文 執行上下文&…

計算機網絡——數據鏈路層的功能

目錄 物理鏈路 邏輯鏈路 封裝成幀&#xff08;組幀&#xff09; 幀定界 透明傳輸 SDU 差錯控制 可靠傳輸 流量控制 介質訪問控制 主機需要實現第一層到第五層的功能&#xff0c;而路由器這種節點只需要實現第一層到第三層的這些功能 假設左邊用戶需要給右邊用戶發送…

計算機網絡 --應用層

計算機網絡 --應用層 一、應用層概述 1. 功能 應用層為應用程序通信提供直接服務&#xff0c;這種服務是用戶能夠直接感知到的數據通信服務。核心功能包括&#xff1a; 文件傳輸&#xff1a;實現不同設備間文件的傳輸操作。訪問管理&#xff1a;對用戶訪問資源等進行管理。電…

企業級Linux服務器初始化優化全流程

實戰指南&#xff1a;企業級Linux服務器初始化優化全流程 本文基于某電商平臺百萬級并發服務器的真實調優案例整理&#xff0c;所有操作均在Rocky Linux8.5驗證通過&#xff0c;不同發行版請注意命令差異 一、服務器安全加固&#xff08;Situation-Task-Action-Result&#xff…

OpenAI流式解析

OpenAI 流式的代碼&#xff1a; 首選一般請使用os.getenv 去讀環境變量的內容 注意使用pip install python-dotenv 的安裝方法 load_dotenv 是這個庫提供的一個函數&#xff0c;用于讀取 .env 文件并將其中定義的鍵值對設置為系統的環境變量。 默認情況下&#xff0c;load_…

數據抓取的緩存策略:減少重復請求與資源消耗

在數據采集領域&#xff0c;爬蟲效率是決定項目成敗的關鍵因素之一。傳統的爬蟲架構往往因請求頻繁、資源消耗較大以及重復抓取等問題&#xff0c;導致效率低下。這些問題不僅拖慢了數據獲取的速度&#xff0c;還可能引發目標服務器的過載風險&#xff0c;甚至導致爬蟲被限制。…

k8s部署argocd

前言 ArgoCD是一個基于Kubernetes的GitOps持續交付工具&#xff0c;應用的部署和更新都可以在Git倉庫上同步實現&#xff0c;并自帶一個可視化界面。本文介紹如何使用GitHelmArgocd方式來實現在k8s中部署和更新應用服務&#xff1b; 安裝Argocd 準備一個k8s集群&#xff0c;然…

【Linux】MAC幀

目錄 一、MAC幀 &#xff08;一&#xff09;IP地址和MAC地址 &#xff08;二&#xff09;MAC幀格式 &#xff08;三&#xff09;MTU對IP協議的影響、 &#xff08;四&#xff09;MTU對UDP協議的影響 &#xff08;五&#xff09;MTU對TCP協議的影響 二、以太網協議 &…

MySQL - 數據庫基礎操作

SQL語句 結構化查詢語言(Structured Query Language)&#xff0c;在關系型數據庫上執行數據操作、數據檢索以及數據維護的標準語言。 分類 DDL 數據定義語言(Data Definition Language)&#xff0c;定義對數據庫對象(庫、表、列、索引)的操作。 DML 數據操作語言(Data Manip…

GraalVM原生鏡像支持:Spring Cloud應用啟動速度提升90%

引言&#xff1a;當Spring Cloud遇見GraalVM&#xff0c;啟動時間進入秒級時代 傳統Spring Cloud應用因動態類加載、反射等機制導致啟動緩慢&#xff08;通常超過30秒&#xff09;&#xff0c;在Serverless和Kubernetes滾動更新場景下成為性能瓶頸。Spring Cloud 2023.x通過**G…

【Unity3D】攝像機適配場景以及Canvas適配

目錄 寬度不變策略 高度不變策略 寬度不變策略 開發分辨率 750*1334 (寬高比:0.56) 真機分辨率 1170*2532 (寬高比:0.46) 真機寬高比<開發寬高比&#xff0c;采用寬度不變策略 理由&#xff1a;小于代表真機高度比開發高度更大&#xff0c;因此不需要擔心高度上…

HarmonyOS:基于axios實現文件的下載以及下載進度的監聽

#前言&#xff1a;項目開發中&#xff0c;避免不了實現文件下載功能&#xff0c;其他平臺的下載都很成熟&#xff0c;網上的例子也比較多&#xff0c;我就自己項目中實現的下載功能做個總結&#xff0c;你可以參考我的寫法實現功能。 下載封裝基于axios實現的下載功能。 1.下載…