日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Seata如何實現兩階段提交(2PC)分布式事務

來源: 責編: 時間:2024-01-26 17:08:09 274觀看
導讀介紹2PC,全稱為兩階段提交(Two-Phase Commit),是一種在分布式系統中用來保證事務原子性和一致性的協議。它主要用于協調分布式數據庫或分布式事務環境中的多個參與者,確保所有參與者要么一起成功提交事務,要么一起回滾事務,

介紹

2PC,全稱為兩階段提交(Two-Phase Commit),是一種在分布式系統中用來保證事務原子性和一致性的協議。它主要用于協調分布式數據庫或分布式事務環境中的多個參與者,確保所有參與者要么一起成功提交事務,要么一起回滾事務,以保持數據的一致性。r7d28資訊網——每日最新資訊28at.com

圖片圖片r7d28資訊網——每日最新資訊28at.com

在2PC協議中有兩個主要階段:r7d28資訊網——每日最新資訊28at.com

  1. 準備階段(Prepare Phase):

事務協調器接收到發起事務的客戶端請求后,向所有參與該事務的資源管理器(例如數據庫、服務節點等)發送“準備提交”請求。r7d28資訊網——每日最新資訊28at.com

每個資源管理器執行事務操作,并將事務相關的更改鎖定但不提交,然后回復事務協調器它們是否準備好提交事務(根據各自是否能夠成功完成事務而定)。r7d28資訊網——每日最新資訊28at.com

  1. 提交階段(Commit Phase):
  • 如果事務協調器收到了所有資源管理器的肯定答復,即所有參與者都準備好提交事務,則向所有參與者發出“正式提交”指令。r7d28資訊網——每日最新資訊28at.com

  • 若協調器收到任何一個參與者的否定響應,或者在等待超時后仍有參與者未響應,則向所有參與者發出“回滾事務”的指令。r7d28資訊網——每日最新資訊28at.com

通過這種方式,2PC確保了所有節點要么全部完成事務,要么全部撤銷事務,從而維護了分布式環境下的事務原子性。然而,2PC也存在一些缺點,比如單點故障問題(即事務協調器宕機可能導致事務長期阻塞)、網絡分區情況下的不確定性以及性能上的潛在瓶頸。r7d28資訊網——每日最新資訊28at.com

Seata把一個分布式事務理解成一個包含了若干分支事務的全局事務。全局事務的職責是協調其下管轄的分支事務 達成一致,要么一起成功提交,要么一起失敗回滾。此外,通常分支事務本身就是一個關系數據庫的本地事務,下圖是全局事務與分支事務的關系圖:r7d28資訊網——每日最新資訊28at.com

圖片圖片r7d28資訊網——每日最新資訊28at.com

與 傳統2PC 的模型類似,Seata定義了3個組件來協議分布式事務的處理過程r7d28資訊網——每日最新資訊28at.com

圖片圖片r7d28資訊網——每日最新資訊28at.com

  • Transaction Coordinator (TC):事務協調器,它是獨立的中間件,需要獨立部署運行,它維護全局事務的運行狀態,接收TM指令發起全局事務的提交與回滾,負責與RM通信協調各各分支事務的提交或回滾。
  • Transaction Manager (TM):事務管理器,TM需要嵌入應用程序中工作,它負責開啟一個全局事務,并最終向TC發起全局提交或全局回滾的指令。
  • Resource Manager (RM):控制分支事務,負責分支注冊、狀態匯報,并接收事務協調器TC的指令,驅動分支(本地)事務的提交和回滾。

具體實現

案例分析:兩個賬戶在不同的銀行(張三在bank1、李四在bank2),bank1和bank2是兩個微服務。交易過程是,張三給李四轉賬指定金額。r7d28資訊網——每日最新資訊28at.com

上述交易步驟,要么一起成功,要么一起失敗,必須是一個整體性的事務。r7d28資訊網——每日最新資訊28at.com

圖片圖片r7d28資訊網——每日最新資訊28at.com

為了簡化環境搭建,小編這里采用file啟動seata,項目搭建也只是兩個普通的SpringBoot項目,未使用微服務。r7d28資訊網——每日最新資訊28at.com

下載seata服務器

官方下載地址:https://github.com/seata/seata/releasesr7d28資訊網——每日最新資訊28at.com

  1. registry.type=file:

registry.type=file 其類型設置為 file 時,意味著 Seata 的服務注冊中心不依賴于外部的如 Nacos、Eureka、Zookeeper 等第三方注冊中心,而是使用本地文件的方式來存儲和管理服務節點信息。這種模式主要用于快速測試或簡單的單機部署場景,因為在這種模式下無法自動發現和管理集群環境中的其他 Seata Server 節點,不具備高可用性。r7d28資訊網——每日最新資訊28at.com

  1. config.type=file:
  • config.type=file 表示 Seata 使用本地文件作為配置源。這意味著 Seata 會從指定的本地文件中讀取全局事務協調器(TC)、事務管理器(TM)和資源管理器(RM)等組件所需的配置信息,而不是通過Nacos、Apollo或其他遠程配置中心獲取配置。這種方式同樣適用于快速驗證和簡單部署情況,實際生產環境中可能需要結合分布式配置中心來動態更新和管理配置。r7d28資訊網——每日最新資訊28at.com

  • seata安裝初始化參考《SpringCloud Alibaba微服務實戰之環境準備》,注意本次啟動是采用file方式啟動
  • seata啟動:/bin/seata-server.bat -m file

圖片圖片r7d28資訊網——每日最新資訊28at.com

  • bank-1 和 bank-2啟動:

圖片圖片r7d28資訊網——每日最新資訊28at.com

bank-1 和 bank-2服務搭建

庫表建立

CREATE DATABASE `bank1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';CREATE TABLE `account_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`account_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '戶主姓名',`account_no` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '銀行卡號',`account_password` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '帳戶密碼',`account_balance` double NULL DEFAULT NULL COMMENT '帳戶余額',PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;INSERT INTO `account_info` VALUES (2, '張三的賬戶', '1', '', 10000);
CREATE DATABASE `bank2` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';CREATE TABLE `account_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`account_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '戶主姓名',`account_no` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '銀行卡號',`account_password` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '帳戶密碼',`account_balance` double NULL DEFAULT NULL COMMENT '帳戶余額',PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;INSERT INTO `account_info` VALUES (3, '李四的賬戶', '2', NULL, 0);

備注:分別在bank1、bank2庫中創建undo_log表,此表為seata框架使用r7d28資訊網——每日最新資訊28at.com

依賴引入

<dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>io.seata</groupId>            <artifactId>seata-spring-boot-starter</artifactId>            <version>1.4.2</version>        </dependency>        <dependency>            <groupId>com.baomidou</groupId>            <artifactId>mybatis-plus-boot-starter</artifactId>            <version>3.4.1</version>        </dependency>        <!--mysql-->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>5.1.47</version>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>        </dependency>        <!--bank-2 不需要-->        <dependency>            <groupId>org.apache.httpcomponents</groupId>            <artifactId>httpclient</artifactId>        </dependency>    </dependencies>

定義配置

server:  port: 8081  #port: 8082spring:  application:    name: bank-1    #name: bank-2  datasource:    url: jdbc:mysql://localhost:3306/bank1?characterEncoding=utf8&useSSL=false    #url: jdbc:mysql://localhost:3306/bank2?characterEncoding=utf8&useSSL=false    driver-class-name: com.mysql.jdbc.Driver    username: root    password: rootseata:  tx-service-group: order_tx_group #自定義事務組名稱需要與seata-server中的對應  service:    vgroup-mapping:      order_tx_group: default # TC 集群(必須與seata-server保持一致)

定義mapper

# bank-1@Update("update account_info set account_balance = account_balance + #{amount} where account_no = #{accountNo}")int updateAccountBalance(@Param("accountNo") String accountNo, @Param("amount") Double amount);# bank-2@Update("UPDATE account_info SET account_balance = account_balance + #{amount} WHERE account_no = #{accountNo}")int updateAccountBalance(@Param("accountNo") String accountNo, @Param("amount") Double amount);

服務調用

bank-1:r7d28資訊網——每日最新資訊28at.com

@GlobalTransactional    @Override    public void updateAccountBalance(String accountNo, Double amount) {        log.info("******** Bank1 Service Begin ... xid: {}" , RootContext.getXID());        //張三扣減金額        baseMapper.updateAccountBalance(accountNo,amount * -1);        //向李四轉賬        CloseableHttpClient httpclient = HttpClients.createDefault();        HttpGet httpget = new HttpGet("http://localhost:8082/bank2/transfer?amount="+amount);        httpget.addHeader(RootContext.KEY_XID,RootContext.getXID());        try{            CloseableHttpResponse response = httpclient.execute(httpget);            HttpEntity entity = response.getEntity();            String result = EntityUtils.toString(entity);            log.info("bank2 服務返回結果:"+result);        }catch (Exception e){            throw new RuntimeException("bank2 服務異常");        }        //人為制造錯誤        if(amount > 100){            throw new RuntimeException("bank1 make exception amount > 100");        }    }

當業務方法開啟全局異常處理器后,TM注冊到TC獲取到一個XID,此時在業務中,服務遠程訪問時,此XID會被下面分支業務方法RM接收到,當各個方法處理完成后RM會向TC直接交互把結果通過XID通知給TC,最后業務方法結束后,TM會通知TC業務已經完成,TC會根據RM通知的結果來通知各個RM提交或者回滾。但是在分布式事務中,入口TM傳出時不會將XID放入請求頭中向其他服務傳遞,這樣就導致全局異常捕獲失效,因此需要手動將XID設置到請求頭中,攜帶給各分支業務來避免事務失效問題。r7d28資訊網——每日最新資訊28at.com

bank-2:r7d28資訊網——每日最新資訊28at.com

@Transactional    @Override    public void updateAccountBalance(String accountNo, Double amount) {        log.info("******** Bank2 Service Begin ... xid: {}" , RootContext.getXID());        //李四增加金額        baseMapper.updateAccountBalance(accountNo,amount);        //制造異常        if(amount < 100){            throw new RuntimeException("bank1 make exception amount < 100");        }    }

服務配置seata

file.conf:r7d28資訊網——每日最新資訊28at.com

圖片圖片r7d28資訊網——每日最新資訊28at.com

registry.conf:r7d28資訊網——每日最新資訊28at.com

圖片圖片r7d28資訊網——每日最新資訊28at.com

執行流程

正常流程:r7d28資訊網——每日最新資訊28at.com

圖片圖片r7d28資訊網——每日最新資訊28at.com

回滾流程:r7d28資訊網——每日最新資訊28at.com

圖片圖片r7d28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-69008-0.htmlSeata如何實現兩階段提交(2PC)分布式事務

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: React 19 即將推出的四個全新 Hooks,很實用!

下一篇: 聊聊什么是JSX以及在React中的使用

標簽:
  • 熱門焦點
  • 鴻蒙OS 4.0公測機型公布:甚至連nova6都支持

    華為全新的HarmonyOS 4.0操作系統將于今天下午正式登場,官方在發布會之前也已經正式給出了可升級的機型產品,這意味著這些機型會率先支持升級享用。這次的HarmonyOS 4.0支持
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經知道了,就當作復習一下,古人云,溫故而知新嘛。現在,我們就開始今
  • 重估百度丨“晚熟”的百度云,能等到春天嗎?

    &copy;自象限原創作者|程心排版|王喻可2016年7月13日,百度云計算戰略發布會在北京舉行,宣告著百度智能云的正式啟程。彼時的會場座無虛席,甚至排隊排到了門外,在場的所有人幾乎都
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 華為和江淮汽車合作開發百萬元問界MPV?雙方回應來了

    8月1日消息,郭明錤今天在社交平臺發文稱,華為正在和江淮汽車合作,開發售價在100萬元的問界MPV,預計在2024年第2季度量產,銷量目標為上市首年交付5萬輛。
  • 華為將推出盤古數字人大模型 可幫助用戶12小時完成數字人生成

    在今日舉行的2023年華為云數字文娛AI創新峰會上,華為云全球Marketing與銷售服務總裁石冀琳表示,華為云將在后續推出盤古數字人大模型,可幫助用戶12小
  • 機構稱Q2全球智能手機出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據外媒報道,研究機構的報告顯示,由于需求下滑,今年二季度全球智能手機的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
Top 主站蜘蛛池模板: 突泉县| 威远县| 邻水| 梧州市| 辽源市| 旬阳县| 三门峡市| 黑山县| 渭南市| 准格尔旗| 城步| 寿光市| 固原市| 舒兰市| 商都县| 易门县| 华安县| 婺源县| 金塔县| 攀枝花市| 武冈市| 汝城县| 牙克石市| 青神县| 晋江市| 宾阳县| 长春市| 霍城县| 呼伦贝尔市| 漾濞| 拉孜县| 游戏| 冕宁县| 财经| 玉山县| 志丹县| 林州市| 庄河市| 阳西县| 额尔古纳市| 霸州市|