本篇文章為大家展示了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)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(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)銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),官渡網(wǎng)站建設(shè)費(fèi)用合理。
圖片來(lái)自 Seata解析-TM、RM、TC交互流程梳理
維護(hù)全局和分支事務(wù)的狀態(tài),驅(qū)動(dòng)全局事務(wù)提交或回滾。
定義全局事務(wù)的范圍:開(kāi)始全局事務(wù)、提交或回滾全局事務(wù)。
管理分支事務(wù)處理的資源,與TC交談以注冊(cè)分支事務(wù)和報(bào)告分支事務(wù)的狀態(tài),并驅(qū)動(dòng)分支事務(wù)提交或回滾。
基于支持本地 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ǔ)償。
一個(gè)分布式的全局事務(wù),整體是 兩階段提交的模型。全局事務(wù)是由若干分支事務(wù)組成的,分支事務(wù)要滿足 兩階段提交的模型要求,即需要每個(gè)分支事務(wù)都具備自己的:
一階段 prepare 行為
二階段 commit 或 rollback 行為
TCC 模式,不依賴于底層數(shù)據(jù)資源的事務(wù)支持:
一階段 prepare 行為:調(diào)用 自定義的 prepare 邏輯。
二階段 commit 行為:調(diào)用 自定義的 commit 邏輯。
二階段 rollback 行為:調(diào)用 自定義的 rollback 邏輯。
所謂 TCC 模式,是指支持把 自定義的分支事務(wù)納入到全局事務(wù)的管理中。
參照官網(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
<!-- 分布式事務(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>
seata: service: # TC服務(wù)列表 僅注冊(cè)中心為file時(shí)使用 grouplist: default : seata.server.cn:8091 # 事務(wù)群組, service-goods-center為分組,配置項(xiàng)值為TC集群名 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
訪問(wèn) seata數(shù)據(jù)庫(kù)腳本 鏈接,找到對(duì)應(yīng)版本和對(duì)應(yīng)數(shù)據(jù)庫(kù)類型的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';
只需要在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"; }
@LocalTCC
一定需要注解在接口上,否則不生效,此接口可以是尋常的業(yè)務(wù)接口,只要實(shí)現(xiàn)了TCC的兩階段提交對(duì)應(yīng)方法便可,TCC相關(guān)注解如下:
@LocalTCC
適用于SpringCloud+Feign模式下的TCC
@TwoPhaseBusinessAction
注解try方法,其中name為當(dāng)前tcc方法的bean名稱,寫方法名便可(全局唯一),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名稱,全局唯一 * 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); }
在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<>()); //放開(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)題名稱:seata中如何使用AT和TCC模式
標(biāo)題來(lái)源:http://aaarwkj.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)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)