精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發 前端
當業務方法開啟全局異常處理器后,TM注冊到TC獲取到一個XID,此時在業務中,服務遠程訪問時,此XID會被下面分支業務方法RM接收到,當各個方法處理完成后RM會向TC直接交互把結果通過XID通知給TC,最后業務方法結束后,TM會通知TC業務已經完成,TC會根據RM通知的結果來通知各個RM提交或者回滾。

介紹

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

圖片圖片

在2PC協議中有兩個主要階段:

  1. 準備階段(Prepare Phase):

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

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

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

  • 若協調器收到任何一個參與者的否定響應,或者在等待超時后仍有參與者未響應,則向所有參與者發出“回滾事務”的指令。

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

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

圖片圖片

與 傳統2PC 的模型類似,Seata定義了3個組件來協議分布式事務的處理過程

圖片圖片

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

具體實現

案例分析:兩個賬戶在不同的銀行(張三在bank1、李四在bank2),bank1和bank2是兩個微服務。交易過程是,張三給李四轉賬指定金額。

上述交易步驟,要么一起成功,要么一起失敗,必須是一個整體性的事務。

圖片圖片

為了簡化環境搭建,小編這里采用file啟動seata,項目搭建也只是兩個普通的SpringBoot項目,未使用微服務。

下載seata服務器

官方下載地址:https://github.com/seata/seata/releases

  1. registry.type=file:

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

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

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

圖片圖片

  • bank-1 和 bank-2啟動:

圖片圖片

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框架使用

依賴引入

<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: 8082

spring:
  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: root

seata:
  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:

@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設置到請求頭中,攜帶給各分支業務來避免事務失效問題。

bank-2:

@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:

圖片圖片

registry.conf:

圖片圖片

執行流程

正常流程:

圖片圖片

回滾流程:

圖片圖片

責任編輯:武曉燕 來源: 一安未來
相關推薦

2023-07-26 09:24:03

分布式事務分布式系統

2025-06-10 08:02:15

2018-10-29 08:44:29

分布式兩階段提交事務

2025-05-16 07:46:11

分布式事務服務

2021-03-06 23:28:28

2PC3PC模型

2022-06-27 08:21:05

Seata分布式事務微服務

2022-06-21 08:27:22

Seata分布式事務

2024-05-21 14:12:07

2020-05-06 10:19:14

2PC3PC分布式事務

2022-03-24 07:51:27

seata分布式事務Java

2020-04-28 12:18:08

Seata模式分布式

2023-01-06 09:19:12

Seata分布式事務

2022-07-10 20:24:48

Seata分布式事務

2020-05-11 10:30:57

2PC分布式協議

2021-01-13 08:49:36

數據庫2PC優化

2010-04-22 15:11:14

2025-04-30 10:44:02

2024-10-09 14:14:07

2021-04-23 08:15:51

Seata XA AT

2023-11-06 13:15:32

分布式事務Seata
點贊
收藏

51CTO技術棧公眾號

久久久久久成人精品| 91福利精品第一导航| 国产精品一久久香蕉国产线看观看 | 日韩福利一区二区| 久久在线91| 国产香蕉97碰碰久久人人| 久久久久国产一区| gogo在线观看| 91美女在线视频| 国产精品成久久久久三级| 亚洲ⅴ国产v天堂a无码二区| 日韩免费在线电影| 亚洲制服欧美中文字幕中文字幕| 国产伦精品一区二区三区免| 无码人妻av免费一区二区三区 | www.久久国产| 亚洲二区av| 亚洲国产精品视频| 图片区小说区区亚洲五月| 99久久精品国产一区二区成人| 亚洲欧洲一区| 中文字幕亚洲精品| 五月天丁香社区| 校园春色亚洲色图| 亚洲免费观看高清| 欧美日韩中文国产一区发布| 国产精品亚洲欧美在线播放| 午夜在线精品| 日韩中文字幕在线| 亚洲第一黄色网址| 精品视频一二| 在线观看亚洲a| 久久99久久99精品| 91精品国产综合久久久久久豆腐| 粉嫩蜜臀av国产精品网站| 国产精品成人一区| 国产在线观看免费视频今夜| 精品国产一区二区三区噜噜噜| 日韩欧美国产午夜精品| 亚洲精品高清无码视频| 香蕉久久aⅴ一区二区三区| 久久麻豆一区二区| 国产精华一区二区三区| 在线观看免费高清视频| 中国女人久久久| 成年无码av片在线| 欧美一区二区三区粗大| 偷拍亚洲色图| 精品国产一区二区三区四区四| 亚洲最大综合网| 夜鲁夜鲁夜鲁视频在线播放| 亚洲成av人在线观看| 在线观看精品视频| av网站在线播放| 91美女片黄在线观看| 国产伦精品一区二区三区照片91 | 国产亚洲一区二区三区在线播放| 亚洲一级视频在线观看| 青青草国产精品亚洲专区无| 欧美又大又粗又长| 日本一级一片免费视频| 亚洲精品1234| 国语自产精品视频在免费| 女人黄色一级片| 国产一区二区在线| 亚洲精品视频二区| 日本一区二区三区网站| 少妇一区二区三区| 日韩电影中文字幕| 精品人妻一区二区三区日产乱码卜 | 亚洲九九爱视频| 91麻豆天美传媒在线| 精品麻豆一区二区三区 | 欧美一区二区三区的| 中文字幕1234区| 国产在线一区不卡| 日韩一区二区三免费高清| 亚洲18在线看污www麻豆| 欧美jizz18| 欧美老肥妇做.爰bbww| www.色欧美| 国产美女视频一区二区| 日韩欧美国产1| 欧美图片自拍偷拍| 欧美激情极品| 亚洲欧洲日产国码av系列天堂| 丰满少妇一区二区| 日韩精品二区| 欧美大尺度在线观看| 欧美日韩精品在线观看视频| 黄色精品网站| 日本久久91av| 亚洲综合免费视频| 青青草国产成人99久久| 91欧美精品成人综合在线观看| 99热这里精品| 北条麻妃一区二区三区| 久久精品久久精品国产大片| 国产精品四虎| 亚洲乱码国产乱码精品精的特点| 日本精品久久久久久久久久| 成人性教育av免费网址| 欧美高清www午色夜在线视频| 中国老熟女重囗味hdxx| 天天躁日日躁狠狠躁欧美巨大小说| 亚洲午夜小视频| 成人精品一二三区| 91精品91| 97在线视频国产| 怡春院在线视频| 成人国产视频在线观看| 欧美一区少妇| 污污的网站在线看| 欧美性xxxxxxxxx| 色婷婷激情视频| 亚洲欧美tv| 久久国产精品电影| 亚洲婷婷综合网| 国产精品 欧美精品| 欧洲一区二区在线| 里番在线播放| 欧美三级电影网站| 色婷婷精品久久二区二区密| 俺要去色综合狠狠| 97精品一区二区视频在线观看| 中日精品一色哟哟| 99精品国产一区二区三区不卡| 亚洲一区二区三区色| 在线观看网站免费入口在线观看国内| 91精品国产一区二区三区香蕉| a视频免费观看| 亚洲五月婷婷| 91九色在线视频| 黄色毛片在线观看| 偷拍日韩校园综合在线| 日韩电影在线播放| 变态调教一区二区三区| 欧美大片在线观看一区| 91视频综合网| 国产精品自拍在线| 永久免费网站视频在线观看| 日韩亚洲国产免费| 日韩中文字幕精品视频| 亚洲天堂中文字幕在线| 国产精品午夜久久| www.com操| 国产精品99在线观看| 91精品国产自产在线| 一级日本在线| 欧美一区二区三区四区久久| 看免费黄色录像| 国产精品一二三四| 2018中文字幕第一页| 国产精品极品| 538国产精品一区二区免费视频 | 波多野结衣91| 国产精品免费入口| 精品国产乱码| 国产日韩在线一区| 老司机在线视频二区| 91精品国产手机| 久久这里只有精品国产| 播五月开心婷婷综合| 99热成人精品热久久66| 国产精品一国产精品| 国产三级精品网站| 男男gaygays亚洲| 日韩精品极品毛片系列视频| 奴色虐av一区二区三区| 国产精品免费久久| 三上悠亚 电影| 亚洲中字在线| 一区精品视频| 国产精品色呦| 国产精品第一区| 中文字幕在线观看网站| 亚洲大胆人体视频| 欧美超碰在线观看| 亚洲视频一二三| 六十路息与子猛烈交尾| 日本欧美一区二区在线观看| 黄色网络在线观看| 日本成人7777| 成人黄色免费片| 成人观看网址| 一本一本久久a久久精品牛牛影视 一本色道久久综合亚洲精品小说 一本色道久久综合狠狠躁篇怎么玩 | 日韩欧美黄色影院| 青草视频在线观看免费| 国产精品传媒入口麻豆| 好吊操视频这里只有精品| 久久久久国产精品一区三寸| 好色先生视频污| 国产91久久精品一区二区| 91色视频在线导航| 英国三级经典在线观看| 超碰日本道色综合久久综合| 黄色在线小视频| 日韩女优制服丝袜电影| 亚洲av无码乱码国产精品fc2| 亚洲男人天堂av| 永久免费看mv网站入口78| 国产一区二区精品久久99| 国产熟女高潮视频| 黄色av一区| 公共露出暴露狂另类av| 九色精品国产蝌蚪| 国产精品久久精品视| 国产亚洲精彩久久| 啪一啪鲁一鲁2019在线视频| 肉肉视频在线观看| 一本色道久久88综合日韩精品| 免费国产精品视频| 欧美丰满美乳xxx高潮www| 免费看毛片网站| 午夜影视日本亚洲欧洲精品| 欧美日韩午夜视频| 国产欧美精品一区| 一级片手机在线观看| 本田岬高潮一区二区三区| 亚洲黄色片免费| 免费看日韩精品| 18岁视频在线观看| 中文高清一区| 国产玉足脚交久久欧美| 一本精品一区二区三区| 宅男av一区二区三区| 国产一区二区在线| 欧美视频小说| 亚洲最大在线| 蜜桃日韩视频| 亚洲色图丝袜| 久久婷婷开心| 小说区图片区色综合区| 精品久久久久久亚洲| ccyy激情综合| 99re国产| 成人h动漫免费观看网站| 国产欧美一区二区白浆黑人| av在线播放一区| 国产精品天天狠天天看| 日韩制服一区| 国产精品中文久久久久久久| 成人黄色毛片| 国产精品久久久久久久app| 综合在线影院| 国产日本欧美一区二区三区在线| 午夜精品久久久久久久久久蜜桃| 国产成人午夜视频网址| 秋霞国产精品| 国产精品色视频| 国产成人a视频高清在线观看| 国产精品视频免费观看www| 成人av集中营| 91久久久亚洲精品| 亚洲福利合集| 国产区一区二区三区| 日韩在线麻豆| 午夜精品福利一区二区| 成人动漫免费在线观看| 欧美精品成人一区二区在线观看 | 日韩xxxxxxxxx| 精品久久久久人成| 欧美a视频在线观看| 欧美亚洲动漫精品| 国产三级按摩推拿按摩| 日韩欧美一区二区免费| 欧洲成人一区二区三区| 亚洲欧美国产精品久久久久久久| 看电影就来5566av视频在线播放| 尤物tv国产一区| 成a人片在线观看| 97香蕉超级碰碰久久免费软件| 丝袜美腿一区| 91九色视频在线| 欧美电影完整版在线观看| 日韩av电影免费观看| 91tv精品福利国产在线观看| 亚洲国产成人精品无码区99| 老司机午夜精品视频| theporn国产精品| 99久久精品国产麻豆演员表| 国产91在线播放九色| 亚洲一区二区黄色| 成年人晚上看的视频| 日韩精品在线一区二区| 免费在线国产| 欧美精品免费在线| 黑人巨大亚洲一区二区久 | 亚洲第一视频在线| 亚洲欧美精品一区| 天堂av资源在线观看| 国产精品video| 57pao国产一区二区| 日韩国产欧美一区| 国产精品大片| 青青草原国产在线视频| 99r精品视频| 亚洲熟女www一区二区三区| 一本色道久久综合精品竹菊| 精品国产亚洲av麻豆| 国产亚洲福利一区| 懂色av一区| 成人精品福利视频| 国产成人调教视频在线观看 | 熟女少妇a性色生活片毛片| 精品欧美一区二区三区| a级片免费观看| 在线视频日本亚洲性| 欧美gv在线观看| 超碰97在线资源| 日韩午夜电影网| 欧美一级黄色影院| 不卡的看片网站| 免费视频一二三区| 制服丝袜一区二区三区| 成人午夜影视| 日韩免费不卡av| 日韩欧美四区| 黄色大片中文字幕| 国产精品一区在线观看乱码| 任你操精品视频| 欧美在线一区二区三区| 欧美色视频免费| 国产91成人在在线播放| 国产成人福利av| 日韩精品一区二区免费| 国产一区二区电影| 国产激情无码一区二区三区| 欧美伊人久久久久久久久影院| 日本福利片高清在线观看| 午夜精品福利电影| 精品自拍偷拍| 国产黄色片免费在线观看| 成人妖精视频yjsp地址| 麻豆成人在线视频| 日韩写真欧美这视频| 爆操欧美美女| 亚洲自拍偷拍福利| 天天av综合| 亚洲精品视频三区| 亚洲天堂免费在线观看视频| 国产精品一区二区黑人巨大| 日韩在线免费视频| 爱情电影网av一区二区| a级黄色片网站| 国产精品99久久久久久宅男| 亚洲国产美女视频| 日韩一区二区中文字幕| 暖暖在线中文免费日本| 99re在线播放| 国内精品福利| 毛茸茸多毛bbb毛多视频| 欧美日韩精品国产| 韩国中文免费在线视频| 国产精品久久久久久av下载红粉| 日韩欧美精品一区| 丰满人妻一区二区三区53视频| 伊人夜夜躁av伊人久久| 欧美性猛交 xxxx| 2020久久国产精品| 欧美色图国产精品| 成人不卡免费视频| 亚洲福利一区二区| 免费在线稳定资源站| 国产精品自拍偷拍视频| 欧美88av| 魔女鞋交玉足榨精调教| 欧美日韩成人综合在线一区二区| 羞羞电影在线观看www| 九九九九精品| 麻豆国产精品视频| 免费在线观看黄色av| 亚洲精品小视频| 免费成人高清在线视频| 成人av在线不卡| 国产日韩精品视频一区| 国产裸体无遮挡| 91国内在线视频| 欧美wwwww| youjizz.com日本| 在线精品视频一区二区三四| av网址在线播放| 麻豆91av| 国产一区二区三区不卡在线观看| 1级黄色大片儿| 色噜噜狠狠狠综合曰曰曰88av| 日韩精品三级| 不要播放器的av网站| 中文字幕日韩一区二区| 天天操天天射天天舔| 国产日本欧美一区| 国产视频一区欧美| 欧美一级特黄高清视频| 亚洲欧美另类人妖| 2020最新国产精品| 欧美第一页浮力影院| 欧美天堂在线观看| 伦理在线一区| 在线不卡视频一区二区| 久久亚洲一区二区三区明星换脸|