high-concurrent-actual
  • Introduction
  • 分布式锁实现方案
    • 分布式锁介绍
    • 基于redis(一)
    • 基于redis(二)
    • 基于zookeeper
    • 分布式锁的应用场景
    • 分布式锁方案比较
  • 分布式事务解决方案
    • LCN解决分布式事务
    • 分布式相关的解决方案介绍
    • 消息队列解决方案
    • TCC解决方案
    • 本地消息表解决方案
    • SpringBoot实现分布式事务
    • SpringCloudAlibaba - 阿里分布式事务Seata
    • SpringCloudAlibaba - 阿里RocketMQ
    • RabbitMQ消息队列的分布式事务解决方案
  • 分布式系统校验解决方案
    • 分布式Session
    • JWT方式
    • 单点登录框架
  • 互联网高可用架构分析
  • 分布式订单流水号生成策略
Powered by GitBook
On this page

Was this helpful?

  1. 分布式事务解决方案

TCC解决方案

Previous消息队列解决方案Next本地消息表解决方案

Last updated 5 years ago

Was this helpful?

一个主业务服务(交易订单)roncoo-pay-service-trade

两个从业务服务(资金账户roncoo-pay-service-account)(积分roncoo-pay-service-point)。

3个服务都要引入下面包

<!-- tcc-transaction begin --> <dependency> <groupId>org.mengyun</groupId> <artifactId>tcc-transaction-spring</artifactId> <version>${tcc.version}</version> </dependency> <dependency> <groupId>org.mengyun</groupId> <artifactId>tcc-transaction-core</artifactId> <version>${tcc.version}</version> </dependency> <dependency> <groupId>org.mengyun</groupId> <artifactId>tcc-transaction-api</artifactId> <version>${tcc.version}</version> </dependency>

1.引用tcc-transaction-spring包

从业务的api接口要引用(主服务的api接口不需要)

3个服务都要引用

3.数据库除了自己的业务数据库之外,还有一个tcc事务日志数据库。

<!--======= 事务配置 Begin ================= --> <!-- 事务管理器(由Spring管理MyBatis的事务) --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 关联数据源 --> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 注解事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!--======= 事务配置 End =================== -->

<!--======= TCC Transaction Begin ================= --> <!-- 设置恢复策略(可选),V1.1.0 新增定时任务配置 --> <bean class="org.mengyun.tcctransaction.spring.recover.DefaultRecoverConfig"> <!-- maxRetryCount表示一个事务最多尝试恢复次数,超过将不在自动恢复,需要人工干预,默认是30次 --> <property name="maxRetryCount" value="30"/> <!-- recoverDuration表示一个事务日志当超过一定时间间隔后没有更新就会被认为是发生了异常,需要恢复, 恢复Job将扫描超过这个时间间隔依旧没有更新的事务日志,并对这些事务进行恢复,时间单位是秒,默认是120秒 --> <property name="recoverDuration" value="120"/> <!-- cronExpression表示恢复Job触发间隔配置,默认是(每分钟)0 */1 * * * ? --> <property name="cronExpression" value="0 */1 * * * ?"/> </bean>

<!-- TCC 业务活动日志(事务日志)的数据源 --> <bean id="tccDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="clone"> <!-- 基本属性driverClassName、 url、user、password --> <property name="driverClassName" value="${trade.jdbc.driver}" /> <property name="url" value="${trade.tcc.jdbc.url}" /> <property name="username" value="${trade.jdbc.username}" /> <property name="password" value="${trade.jdbc.password}" />

<!-- 配置初始化大小、最小、最大 --> <!-- 通常来说,只需要修改initialSize、minIdle、maxActive --> <!-- 初始化时建立物理连接的个数,缺省值为0 --> <property name="initialSize" value="${jdbc.initialSize}" /> <!-- 最小连接池数量 --> <property name="minIdle" value="${jdbc.minIdle}" /> <!-- 最大连接池数量,缺省值为8 --> <property name="maxActive" value="${jdbc.maxActive}" />

<!-- 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 --> <property name="maxWait" value="${jdbc.maxWait}" /> </bean>

<!-- 使用SpringJdbc事务库 --> <bean id="transactionRepository" class="org.mengyun.tcctransaction.spring.repository.SpringJdbcTransactionRepository"> <property name="dataSource" ref="tccDataSource"/> <property name="domain" value="TRADE"/> <property name="tbSuffix" value="_TRADE"/> </bean> <!--======= TCC Transaction Begin ================= -->

同理其他两个从服务也一样这样配置。

4.进到主业务,在主业务的try里面会通过dubbo调用两个从业务的try方法。(每个业务里都有自己tcc3个方法)

completeSuccessOrder方法就是主业务的try方法。

confirmCompleteSuccessOrder方法就是主业务的confirm方法

cancelCompleteSuccessOrder方法就是主业务的cancel方法

主业务的try方法如下:

主业务的confirm方法如下:

主业务的cancel方法如下:

在主业务的try方法那里调用了从业务的try方法(例如调用资金业务的try方法,从业务里也有tcc3个方法的)如下:

资金业务的try方法:

资金业务的confirm方法:

资金业务的cancel方法:

同理从业务的积分也是一样有这tcc这3个方法。

总结:主业务--1从业务---2从业务,单有一个业务出现异常,3个业务都会回滚,对应的3个数据库的数据也会回滚

参考

https://blog.csdn.net/zhangxiaolang1/article/details/79685733