TCC解决方案
Last updated
Was this helpful?
Last updated
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