1. 程式人生 > >TCC分散式解決方案

TCC分散式解決方案

一個主業務服務(交易訂單)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個數據庫的資料也會回滾