免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

seata中如何使用AT和TCC模式

本篇文章為大家展示了seata中如何使用AT和TCC模式,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

在官渡等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需定制開(kāi)發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營(yíng)銷(xiāo)型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),官渡網(wǎng)站建設(shè)費(fèi)用合理。

seata的AT和TCC模式的使用

名詞解釋

seata中如何使用AT和TCC模式

圖片來(lái)自 Seata解析-TM、RM、TC交互流程梳理

TC (Transaction Coordinator) - 事務(wù)協(xié)調(diào)者

維護(hù)全局和分支事務(wù)的狀態(tài),驅(qū)動(dòng)全局事務(wù)提交或回滾。

TM (Transaction Manager) - 事務(wù)管理器

定義全局事務(wù)的范圍:開(kāi)始全局事務(wù)、提交或回滾全局事務(wù)。

RM (Resource Manager) - 資源管理器

管理分支事務(wù)處理的資源,與TC交談以注冊(cè)分支事務(wù)和報(bào)告分支事務(wù)的狀態(tài),并驅(qū)動(dòng)分支事務(wù)提交或回滾。

模式介紹

AT

  • 基于支持本地 ACID 事務(wù)的關(guān)系型數(shù)據(jù)庫(kù)。

  • Java 應(yīng)用,通過(guò) JDBC 訪問(wèn)數(shù)據(jù)庫(kù)。

兩階段提交協(xié)議的演變:

  • 一階段:業(yè)務(wù)數(shù)據(jù)和回滾日志記錄在同一個(gè)本地事務(wù)中提交,釋放本地鎖和連接資源。

  • 二階段:

    • 提交異步化,非常快速地完成。

    • 回滾通過(guò)一階段的回滾日志進(jìn)行反向補(bǔ)償。

TCC

一個(gè)分布式的全局事務(wù),整體是 兩階段提交的模型。全局事務(wù)是由若干分支事務(wù)組成的,分支事務(wù)要滿(mǎn)足 兩階段提交的模型要求,即需要每個(gè)分支事務(wù)都具備自己的:

  • 一階段 prepare 行為

  • 二階段 commit 或 rollback 行為

TCC 模式,不依賴(lài)于底層數(shù)據(jù)資源的事務(wù)支持:

  • 一階段 prepare 行為:調(diào)用 自定義的 prepare 邏輯。

  • 二階段 commit 行為:調(diào)用 自定義的 commit 邏輯。

  • 二階段 rollback 行為:調(diào)用 自定義的 rollback 邏輯。

所謂 TCC 模式,是指支持把 自定義的分支事務(wù)納入到全局事務(wù)的管理中。

使用

配置

1. 啟動(dòng)seata-server

參照官網(wǎng)部署教程,啟動(dòng)成功后可以看到這句 Server started, listen port: 8091,注意這個(gè)端口不是用來(lái)通過(guò)http訪問(wèn)的, 這個(gè)端口是用來(lái)協(xié)調(diào)應(yīng)用分布式事務(wù)的,直接通過(guò)瀏覽器訪問(wèn)會(huì)報(bào)錯(cuò)。

SLF4J: A number (18) of logging calls during the initialization phase have been intercepted and are
SLF4J: now being replayed. These are subject to the filtering rules of the underlying logging system.
SLF4J: See also http://www.slf4j.org/codes.html#replay
09:54:04.048  INFO --- [                     main] io.seata.config.FileConfiguration        : The file name of the operation is registry
09:54:04.055  INFO --- [                     main] io.seata.config.FileConfiguration        : The configuration file used is C:\Server\seata-server-1.4.2\conf\registry.conf
09:54:04.119  INFO --- [                     main] io.seata.config.FileConfiguration        : The file name of the operation is file.conf
09:54:04.119  INFO --- [                     main] io.seata.config.FileConfiguration        : The configuration file used is C:\Server\seata-server-1.4.2\conf\file.conf
09:54:06.578  INFO --- [                     main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
09:54:07.304  INFO --- [                     main] i.s.core.rpc.netty.NettyServerBootstrap  : Server started, listen port: 8091
2. 添加依賴(lài)
<!-- 分布式事務(wù)seata -->
<dependency>
    <groupid>com.alibaba.cloud</groupid>
    <artifactid>spring-cloud-starter-alibaba-seata</artifactid>
</dependency>

<!-- 序列化方式選擇的kryo, 在使用jackson和fastjson時(shí),對(duì)時(shí)間的序列化一直出問(wèn)題 -->
<dependency>
    <groupid>de.javakaffee</groupid>
    <artifactid>kryo-serializers</artifactid>
    <version>${kryo.serializers.version}</version>
</dependency>
3. 添加配置
seata:
  service:
  	# TC服務(wù)列表 僅注冊(cè)中心為file時(shí)使用
    grouplist:
      default : seata.server.cn:8091
    # 事務(wù)群組, service-goods-center為分組,配置項(xiàng)值為T(mén)C集群名
    vgroup-mapping:
      service-goods-center: default
    # 全局事務(wù)開(kāi)關(guān),默認(rèn)false。false為開(kāi)啟,true為關(guān)閉
    disable-global-transaction: false
  # 視作分名
  tx-service-group: service-goods-center
  client:
    undo:
      # undolog的序列化方式, AT模式需要配置,因?yàn)锳T模式數(shù)據(jù)庫(kù)會(huì)有undo-log表
      log-serialization: kryo
4. 數(shù)據(jù)庫(kù)配置

訪問(wèn) seata數(shù)據(jù)庫(kù)腳本 鏈接,找到對(duì)應(yīng)版本和對(duì)應(yīng)數(shù)據(jù)庫(kù)類(lèi)型的SQL腳本,在業(yè)務(wù)系統(tǒng)創(chuàng)建出來(lái)undo-log表。

1.3.0版本

CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT(20)   NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(100) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';

AT模式的使用

只需要在TM端服務(wù)方法上加上@GlobalTransactional注解,被調(diào)用RM端方法可以不用顯式的聲明@GlobalTransactional注解

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public String insert() {
    service.insert();
    //放開(kāi)以下注解拋出異常
    //throw new RuntimeException("服務(wù)AT測(cè)試回滾");
    return "success";
}

TCC的使用

1. 定義TCC接口

@LocalTCC一定需要注解在接口上,否則不生效,此接口可以是尋常的業(yè)務(wù)接口,只要實(shí)現(xiàn)了TCC的兩階段提交對(duì)應(yīng)方法便可,TCC相關(guān)注解如下:

  • @LocalTCC 適用于SpringCloud+Feign模式下的TCC

  • @TwoPhaseBusinessAction 注解try方法,其中name為當(dāng)前tcc方法的bean名稱(chēng),寫(xiě)方法名便可(全局唯一),commitMethod指向提交方法,rollbackMethod指向事務(wù)回滾方法。指定好三個(gè)方法之后,seata會(huì)根據(jù)全局事務(wù)的成功或失敗,去幫我們自動(dòng)調(diào)用提交方法或者回滾方法。

  • @BusinessActionContextParameter 注解可以將參數(shù)傳遞到二階段(commitMethod/rollbackMethod)的方法。

  • BusinessActionContext 便是指TCC事務(wù)上下文

/**
 * 這里定義tcc的接口
 * 這些一定要定義在接口上
 * 我們使用springCloud的遠(yuǎn)程調(diào)用
 * 那么這里使用LocalTCC便可
 *
 * @author tanzj
 */
@LocalTCC
public interface TccService {
 
    /**
     * 定義兩階段提交
     * name = 該tcc的bean名稱(chēng),全局唯一
     * commitMethod = commit 為二階段確認(rèn)方法
     * rollbackMethod = rollback 為二階段取消方法
     * BusinessActionContextParameter注解 傳遞參數(shù)到二階段中
     *
     */
    @TwoPhaseBusinessAction(name = "insert", commitMethod = "commitTcc", rollbackMethod = "cancel")
    String insert(
            @BusinessActionContextParameter(paramName = "params") Map<string, string> params
    );
 
    /**
     * 確認(rèn)方法、可以另命名,但要保證與commitMethod一致
     * context可以傳遞try方法的參數(shù)
     * 參數(shù)是固定的, 不可以增加或減少,
     */
    boolean commitTcc(BusinessActionContext context);
 
    /**
     * 二階段取消方法
     * 參數(shù)是固定的, 不可以增加或減少
     */
    boolean cancel(BusinessActionContext context);
}
2. TCC接口的調(diào)用和實(shí)現(xiàn)
  • 在try方法中使用@Transational可以直接通過(guò)spring事務(wù)回滾關(guān)系型數(shù)據(jù)庫(kù)中的操作,而非關(guān)系型數(shù)據(jù)庫(kù)等中間件的回滾操作可以交給rollbackMethod方法處理。

  • 使用context.getActionContext("params")便可以得到一階段try中定義的參數(shù),在二階段對(duì)此參數(shù)進(jìn)行業(yè)務(wù)回滾操作。

  • **注意1:**此處亦不可以捕獲異常(同理切面處理異常),否則TCC將識(shí)別該操作為成功,二階段直接執(zhí)行commitMethod。

  • **注意2:**TCC模式要開(kāi)發(fā)者自行保證冪等和事務(wù)防懸掛

調(diào)用代碼

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public String insert() {
    log.info("xid = " + RootContext.getXID());
    //todo 實(shí)際的操作,或操作MQ、redis等
    tccDAO.insert(new HashMap&lt;&gt;());
    //放開(kāi)以下注解拋出異常
    //throw new RuntimeException("服務(wù)tcc測(cè)試回滾");
    return "success";
}

混合使用

也沒(méi)別的,默認(rèn)使用的就是AT事務(wù),別在同一個(gè)接口方法上添加TCC注解就行,可以通過(guò)AT方法嵌套TCC方法,注意不要通過(guò)this.xx()調(diào)用,這樣會(huì)無(wú)法應(yīng)用代理的增強(qiáng)。

mybatis-plus出現(xiàn)問(wèn)題,解決方案

透過(guò)源碼解決SeataAT模式整合Mybatis-Plus失去MP特性的問(wèn)題</string,>

上述內(nèi)容就是seata中如何使用AT和TCC模式,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標(biāo)題名稱(chēng):seata中如何使用AT和TCC模式
標(biāo)題來(lái)源:http://m.newbst.com/article26/pjchjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司品牌網(wǎng)站制作品牌網(wǎng)站設(shè)計(jì)網(wǎng)站設(shè)計(jì)公司全網(wǎng)營(yíng)銷(xiāo)推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)