tcc-transaction分布式TCC型事务框架搭建与使用记录

更新时间:2023-07-08 08:22:58 阅读: 评论:0

tcc-transaction分布式TCC型事务框架搭建与使⽤记录
⾸先感谢框架作者。本⽂只介绍框架使⽤,并不分析。
TCC为Try、Confirm、Cancel的缩写:try阶段预留资源尝试提交,confirm阶段确定提交,cancel取消提交释放资源。
本⽂的例⼦为:创建资产,将资产信息同时同步到Mongo与ES的流程(ES代码不列出了,与mongo类似),整个流程保证数据⼀致(本场景可能并不适合,看⼀下代码结构即可)。
代码与流程:
1.下载1.
2.x版本源码,并可能需要修改部分代码
因为是第三⽅包,所以需要⾃⼰打包到本地仓库。但包中spring版本为3.2.12.RELEASE,如果本地项⽬为4.x,⽐如本⼈的项⽬spring版本为4.3.4.RELEASE,如果不修改tcc中的spring版本,将报错⽆法启动。
源码修改⽐较简单,如下:
1.1 修改tcc-transaction总l⽂件
1<!-- 第⼀处:修改版本为4.3.4  -->
2<springframework.version>4.3.4.RELEASE</springframework.version>
3
4<!-- 第⼆处:修改版本为2.2.1  -->
5<dependency>
6      <groupId>org.quartz-scheduler</groupId>
7      <artifactId>quartz</artifactId>
8      <version>2.2.1</version>
9      <exclusions>
10          <exclusion>
11              <groupId>c3p0</groupId>
12              <artifactId>c3p0</artifactId>
13          </exclusion>
14      </exclusions>
15</dependency>
16
17<!-- 第三处:修改版本为2.5.3  -->
18<dependency>
鸡子大饼19      <groupId>com.alibaba</groupId>
20      <artifactId>dubbo</artifactId>
21      <version>2.5.3</version>
22</dependency>
1.2 修改 tcc-transaction-
spring/src/main/java/org/mengyun/tcctransaction/spring/recover/RecoverScheduledJob.java 该⽂件中 CronTriggerBean类在4.x中已经不存在,也是修改源码主要修改的地⽅。
修改其中的init⽅法,修改后如下:
1public void init() {
2
3        try {
4            MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
5            jobDetail.tTargetObject(transactionRecovery);
6            jobDetail.tTargetMethod("startRecover");
7            jobDetail.tName("transactionRecoveryJob");
8            jobDetail.tConcurrent(fal);
9            jobDetail.afterPropertiesSet();
10
11            CronTriggerFactoryBean cronTrigger = new CronTriggerFactoryBean();
12            cronTrigger.tBeanName("transactionRecoveryCronTrigger");
13            cronTrigger.Object());
14
15            cronTrigger.RecoverConfig().getCronExpression());
16            cronTrigger.afterPropertiesSet();
17
18            scheduler.Object(), Object());
19
20            scheduler.start();
21
22        } catch (Exception e) {
23            throw new SystemException(e);
24        }
25    }
1.3 打包并发布
mvn -st.skip=true install
2.项⽬依赖
参考1.2.x使⽤指南,引⼊两个依赖(本⼈项⽬使⽤SOA架构dubbo框架,我使⽤并打包时版本为1.2.3.1)。调⽤⽅和提供⽅都需要引⼊依赖。
3.加载l配置
原⽂中是配置在l中,我个⼈试了⼀下放在dubbo web项⽬的l中,但配置并没有被加载。该⽂件的意义只是希望项⽬启动时被加载,于是直接在dubbo中的⼀个spring的配置⽂件中引⼊,如下:
1<!-- TCC Transaction -->
2<import resource="l" />
该⽂件⾥⾯提供各种aop逻辑,项⽬启动时扫描指定注解,并做增强。
4.设置TransactionRepository
需要为tcc配置数据源,可以是mysql或其他nosql,本⽂使⽤msyql,其他可参见原指南⽂档。
mysql配置如下:
1<!--tcc-->
2<bean id="tccDataSource" class="s.dbcp.BasicDataSource" destroy-method="clo">
3 <property name="driverClassName" value="${jdbc.driverClassName}" />
4 <property name="url" value="${url}" />
5 <property name="urname" value="${jdbc.urname}" />
6 <property name="password" value="${jdbc.password}" />
7 <property name="initialSize" value="${dbcp.initialSize}" />
8 <property name="maxActive" value="${dbcp.maxActive}" />
9 <property name="maxIdle" value="${dbcp.maxIdle}" />
a股熔断
10 <property name="maxWait" value="${dbcp.maxWait}" />
女人五十11 <property name="poolPreparedStatements" value="${dbcp.poolPreparedStatements}" />
12 <property name="defaultAutoCommit" value="${dbcp.defaultAutoCommit}" />
13 <property name="timeBetweenEvictionRunsMillis" value="${dbcp.timeBetweenEvictionRunsMillis}" />
14 <property name="minEvictableIdleTimeMillis" value="${dbcp.minEvictableIdleTimeMillis}" />
15</bean>
16
17<bean id="transactionRepository"
18  class="pository.SpringJdbcTransactionRepository">
19 <property name="dataSource" ref="tccDataSource"/>
20 <property name="domain" value="SAAS"/>
21 <property name="tbSuffix" value="_ASSET"/>
22</bean>
23
24<bean class="ver.DefaultRecoverConfig">
25 <property name="maxRetryCount" value="30"/>
26 <property name="recoverDuration" value="120"/>
27 <property name="cronExpression" value="0 */1 * * * ?"/>
28 <property name="delayCancelExceptions">
29  <util:t>
30  <value>com.ing.TimeoutException</value>
31  </util:t>
32 </property>
33</bean>
需要注意的点:1.数据源必须配置新的,不能使⽤之前项⽬存在的dataSource的bean,也不能在同⼀库中,不然会导致tcc表数据与本地事务⼀起回滚,从⽽⽆法保存异常事务⽇志;2.注意domain、tbSuffix的配置,这两项⽂档中并没有配置,但源码demo中配置了,⽤于数据库的表名称等,推荐配置;3.最后的DefaultRecoverConfig项是可选的,⽤于恢复与重试,具体作⽤参考使⽤指南;
4.defaultAutoCommit必须为true(默认为true)
根据以上的tbSufifix配置,脚本如下:
加鸡腿什么意思
1CREATE TABLE `tcc_transaction_ast` (
2  `TRANSACTION_ID` int(11) NOT NULL AUTO_INCREMENT,
3  `DOMAIN` varchar(100) DEFAULT NULL,
4  `GLOBAL_TX_ID` varbinary(32) NOT NULL,
5  `BRANCH_QUALIFIER` varbinary(32) NOT NULL,
6  `CONTENT` varbinary(8000) DEFAULT NULL,
7  `STATUS` int(11) DEFAULT NULL,
8  `TRANSACTION_TYPE` int(11) DEFAULT NULL,
9  `RETRIED_COUNT` int(11) DEFAULT NULL,
10  `CREATE_TIME` datetime DEFAULT NULL,
11  `LAST_UPDATE_TIME` datetime DEFAULT NULL,
12  `VERSION` int(11) DEFAULT NULL,哪款手机好用
13  PRIMARY KEY (`TRANSACTION_ID`),
14  UNIQUE KEY `UX_TX_BQ` (`GLOBAL_TX_ID`,`BRANCH_QUALIFIER`)
15) ENGINE=InnoDB DEFAULT CHARSET=utf8
如果表名称不对,启动过程会报错,做相应调整即可。
6.发布服务(重点)
6.1 dubbo接⼝
1public interface AstCardService {
2
3    /**
4    * 测试预保存资产(状态为待确认)
5    */
6    @Compensable
7    int testSaveAstCard(AstCardModel model);
8
9    /**
10    * 确认保存资产到mysql(状态为正常)
11    */
12    int confirmMysqlSaveAstCard(AstCardModel model);
13
14    /**
15    * 取消保存资产到msyql(更新状态为删除)
蒋智由16    */
17    int cancelMysqlSaveAstCard(AstCardModel model);
18
19    /**
20    * 预保存资产到mongo(状态为待确认)
21    */
22    @Compensable
23    void processMongo(AstCardModel model);
24
25    /**
26    * 确认保存资产到mongo(状态为正常)
27    */
28    void confirmMongoSaveAstCard(AstCardModel model);
29
30    /**
31    * 取消保存资产到mongo(更新状态为删除)
32    */
33    void cancelMongoSaveAstCard(AstCardModel model);
34
35}
需要注意的点:1.对外提供服务的接⼝必须有@Compensable注解;2.对应的confirm与cancel⽅法必须声明为接⼝,不能声明为
private,即使是public也不⾏,必须有接⼝。
6.2 dubbo接⼝实现类
1    @Override
2    @Compensable(confirmMethod = "confirmMysqlSaveAstCard", cancelMethod = "cancelMysqlSaveAstCard", transactionContextEditor = DubboTransa
什么是教学策略3    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class })
4    public int testSaveAstCard(AstCardModel model){
婴儿缺铁的表现与症状5
6        // 保存mysql,data状态为-1
7        model.tDataStatus(-1);
8        astCardDao.inrt(model);
9
10
11        // mongo处理
12        astCardService.processMongo(model);
13
14        Id();
15    }

本文发布于:2023-07-08 08:22:58,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1072714.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:资产   配置   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图