Seata服務端回滾事務核心源碼解析

文章目錄

  • 前言
  • 一、doGlobalRollback
    • 3.1、changeGlobalStatus
    • 3.2、doGlobalRollback


前言

??本篇介紹Seata服務端接收到客戶端TM回滾請求,進行處理并且驅動所有的RM進行回滾的源碼。


一、doGlobalRollback

??doGlobalRollback是全局回滾的方法:
在這里插入圖片描述
??首先依舊是進行校驗,添加監聽器。然后會關閉會話,阻止新分支注冊,保證了在回滾執行期間,不會再有分支悄悄進來。

  • 判斷事務是否還在「初始狀態」,如果是,就可以把狀態改為 Rollbacking。
  • 否則說明這個事務已經處于回滾中或提交中,可能是別的線程已經發起操作;就不再做重復回滾處理。
  • doGlobalRollback中完成全局事務回滾的邏輯。
    在這里插入圖片描述

3.1、changeGlobalStatus

??該方法主要是用于修改表中的狀態:

  • lock_table表中對應XID的狀態改為回滾。
  • global_table表中對應XID的狀態改為回滾。

在這里插入圖片描述

3.2、doGlobalRollback

??doGlobalRollback的邏輯和提交事務的邏輯類似,也是有幾個關鍵部分:

  1. 得到當前XID下的所有分支事務。
  2. 遍歷這些分支事務。
  3. 拿到分支事務的狀態,如果狀態是一階段提交失敗,就直接移除該分支,然后繼續下次循環。
  4. 驅動RM回滾。
  5. 根據RM返回的錯誤碼判斷。
  6. 執行最后的清理工作。

在這里插入圖片描述
??根據RM返回的錯誤碼:

  • PhaseTwo_Rollbacked代表回滾成功,會執行removeBranch的邏輯,刪除該分支在lock_tablebranch_table以及branchSessions中的記錄。
  • PhaseTwo_RollbackFailed_Unretryable代表回滾失敗,并且無法重試了,會執行endRollbackFailed的邏輯。

??endRollbacked方法中,根據不同的狀態,對global_table的狀態進行修改。
在這里插入圖片描述
??最終都會執行globalSession.end();方法,清除全局事務在lock_table表中的記錄,然后清理掉global_table的記錄。
??那既然 globalSession.end() 最終會物理刪除 global_table 的記錄,那為什么前面還要調用 globalSession.changeGlobalStatus(…) 去更新狀態?

changeGlobalStatus() 雖然最終會更新數據庫中的 status 字段,但是在過程中它觸發了事務生命周期鉤子機制,供系統其他部分觀察狀態變化。
changeGlobalStatus(): 我告訴所有人,這個事務已經結束了(并以某種狀態結束)
end(): 把這筆事務從系統生命周期中移除(內存 + 數據庫)

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

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

相關文章

新聞客戶端案例的實現,使用axios獲取數據并渲染頁面,路由傳參(查詢參數,動態路由),使用keep-alive實現組件緩存

文章目錄 0.頁面要求1.功能要求2.開始路由配置2.1.嵌套二級路由如何配置?2.2.路由重定向,NotFound頁面,去除"#"號 3.實現底部導航欄的高亮效果4.渲染首頁:使用axios請求數據5.路由傳參5.1.回顧:查詢參數傳參或者動態路由傳參5.2.具體代碼 6.渲染詳情頁7.解決請求過程…

文件操作--文件包含漏洞

本文主要內容 腳本 ASP、PHP、JSP、ASPX、Python、Javaweb --# 各種包含函數 檢測 白盒 代碼審計 黑盒 漏掃工具、公開漏洞、手工看參數值及功能點 類型 本地包含 有限制、無限制 遠程包含 無限制、有限制…

ActiveMQ 性能優化與網絡配置實戰(二)

五、性能優化實戰 5.1 基礎配置調整 5.1.1 增加并發消費者 在 ActiveMQ 中,增加并發消費者是提高消息處理效率的重要手段之一。通過配置多個消費者并行處理消息,可以充分利用系統資源,加快消息的消費速度,從而提高系統的整體吞…

C++/SDL 進階游戲開發 —— 雙人塔防(代號:村莊保衛戰 17)

🎁個人主頁:工藤新一 🔍系列專欄:C面向對象(類和對象篇) 🌟心中的天空之城,終會照亮我前方的路 🎉歡迎大家點贊👍評論📝收藏?文章 文章目錄 二…

貪心算法精解(Java實現):從理論到實戰

一、貪心算法概述 貪心算法(Greedy Algorithm)是一種在每一步選擇中都采取當前狀態下最優決策的算法策略。它通過局部最優選擇來達到全局最優解,具有高效、簡潔的特點。 核心特點: 局部最優選擇:每一步都做出當前看…

深度學習框架:PyTorch使用教程 !!

文章目錄 一、PyTorch框架簡介 1.1 什么是PyTorch 1.2 PyTorch的優勢 二、從入門到精通的PyTorch使用教程 2.1 入門階段 2.1.1 環境安裝與配置 2.1.2 Tensor基礎操作 2.1.3 自動求導(Autograd) 2.1.4 構建神經網絡(nn模塊) 2.1.5 …

系統架構設計師:設計模式——創建型設計模式

一、創建型設計模式 創建型模式抽象了實例化過程,它們幫助一個系統獨立于如何創建、組合和表示它的那些對象。一個類創建型模式使用繼承改變被實例化的類,而一個對象創建型模式將實例化委托給另一個對象。 隨著系統演化得越來越依賴于對象復合而不是類…

Dinero.js - 免費開源的 JavaScript 貨幣處理工具庫,完美解決 JS 浮點數精度丟失問題

今天介紹一個在前后端處理貨幣的工具庫,logo 很可愛,是一只藍色的招財小貓。 本文封面圖底圖來自免費 AI 圖庫 StockCake。 Dinero.js 是一個用于貨幣計算的 JavaScript 工具庫,解決開發者在金融、電商、會計等場景中處理貨幣時的精度丟失、…

HNUST湖南科技大學-嵌入式考試選擇題題庫(109道糾正詳解版)

HNUST嵌入式選擇題題庫 1.下面哪點不是嵌入式操作系統的特點。(B) A.內核精簡 B.功能強大 C.專用性強 D.高實時性 解析: 嵌入式操作系統特點是內核精簡、專用性強、高實時性,而"功能強大"通常指的是通用操作系統&#x…

【工具】Windows批量文件復制教程:用BAT腳本自動化文件管理

一、引言 在日常開發與部署過程中,文件的自動化復制是一個非常常見的需求。無論是在構建過程、自動部署,還是備份任務中,開發者經常需要將某個目錄中的 DLL、配置文件、資源文件批量復制到目標位置。相比使用圖形界面的復制粘貼操作&#xf…

xray-poc編寫示例

禁止未授權掃描和測試行為!!! 1. SQL 時間盲注檢測 (Time-Based Blind SQLi) name: generic/time-based-sqli rules:- method: GETpath: "/product?id1 AND (SELECT 1 FROM (SELECT SLEEP(5))a)--"expression: |response.status…

【Day 14】HarmonyOS分布式數據庫實戰

一、分布式數據庫基礎 1. 核心概念速記表 術語解釋示例場景分布式數據庫數據自動同步到同賬號設備手機添加商品→平板立即顯示KV數據模型鍵值對存儲(類似JSON){"cart_item1": {"name":"牛奶","price":10}}數據…

【數據結構】- 棧

前言: 經過了幾個月的漫長歲月,回頭時年邁的小編發現,數據結構的內容還沒有寫博客,于是小編趕緊停下手頭的活動,補上博客以洗清身上的罪孽 目錄 前言: 棧的應用 括號匹配 逆波蘭表達式 數制轉換 棧的實…

TDA4VM SDK J721E (RTOS/Linux) bootloaders梳理筆記

文章目錄 1. 前言2. RTOS BootLoader2.1 引導模式2.2 啟動序列2.2.1 流程框圖2.2.2 Memory map2.3 鏡像格式詳解3. Linux BootLoader鏡像格式詳解啟動流程參考1. 前言 TDA4VM的BootLoader包含兩部分:RTOS的和Linux的。 2. RTOS BootLoader 這是在SoC上的所有內核運行FreeRTO…

Spring Boot + MyBatis-Plus 的現代開發模式

之前的Maven項目和本次需要的環境配置并不一樣 之前使用的是: 傳統的 MyBatis 框架(非 Spring Boot 環境) 手動管理 SqlSession 使用了 .xml 的 Mapper 映射文件 沒有 Spring 容器管理(沒有 Service / RestController 等&…

【Quest開發】極簡版!透視環境下摳出身體并能遮擋身體上的服裝

前兩天發了一個很復雜的版本,又鼓搗了一下發現完全沒有必要。我之前的理解有點偏(不是錯誤的但用法錯了),但是有一些小伙伴收藏了,害怕里面的某些東西對誰有用,所以寫了一篇新的,前兩步配置環境…

vue 常見ui庫對比(element、ant、antV等)

Element UI 1. 簡介 Element UI 是一個基于 Vue 2 和 Vue 3 的企業級 UI 組件庫,提供了豐富的組件和主題定制功能。官方網站:Element UI 2. 主要特點 豐富的組件:包括表單、表格、布局、導航、彈窗等多種組件。主題定制:支持主…

MATLAB畫一把傘

% 傘的參數num_ribs 5; % 傘骨數量修改為5R 1; % 傘的半徑height 0.5; % 傘的高度handle_length 2; % 傘柄長度semicircle_radius 0.26; % 傘柄末端半圓的半徑% 生成傘葉網格theta linspace(0, 2*pi, 100);phi linspace(0, pi/2, 50);[Theta, Phi] meshgrid(theta, phi…

如何在 Go 中實現各種類型的鏈表?

鏈表是動態內存分配中最常見的數據結構之一。它由一組有限的元素組成,每個元素(節點)至少占用兩塊內存:一塊用于存放數據,另一塊用于存放指向下一個節點的指針。本文教程將說明在 Go 語言中如何借助指針和結構體類型來…

新一代機載相控陣雷達的發展

相控陣雷達以其優越的性能在軍事領域中有著廣闊的應用前景,但由于復雜的技術、昂貴的造價使其應用范圍還存在一定的局限性。然而,國內外對相控陣技術的研究非常重視,并取得了豐碩的成果。 軍用相控陣雷達主要分為陸基、海基和空基幾種類型。 …