1. TX-LCN分布式事務Demo實戰
1.1. 原理介紹
1.1.1. 事務控制原理
- TX-LCN由兩大模塊組成, TxClient、TxManager,TxClient作為模塊的依賴框架,提供TX-LCN的標准支持,TxManager作為分布式事務的控制放。事務發起方或者參與反都由TxClient端來控制。(簡單來說就是單獨部署一套TxManager模塊來實現事務管理,TxClient就是我們自己的服務系統)
- 原理圖如下:

1.1.2. LCN事務模式
1.1.2.1. 原理介紹
- LCN模式是通過代理Connection的方式實現對本地事務的操作,然后在由TxManager統一協調控制事務。當本地事務提交回滾或者關閉連接時將會執行假操作,該代理的連接將由LCN連接池管理。
1.1.2.2. 模式特點
- 該模式對代碼的嵌入性為低。
- 該模式僅限於本地存在連接對象且可通過連接對象控制事務的模塊。
- 該模式下的事務提交與回滾是由本地事務方控制,對於數據一致性上有較高的保障。
- 該模式缺陷在於代理的連接需要隨事務發起方一共釋放連接,增加了連接占用的時間
1.1.3. TCC事務模式
1.1.3.1. 原理介紹
- TCC事務機制相對於傳統事務機制(X/Open XA Two-Phase-Commit),其特征在於它不依賴資源管理器(RM)對XA的支持,而是通過對(由業務系統提供的)業務邏輯的調度來實現分布式事務。主要由三步操作,Try: 嘗試執行業務、 Confirm:確認執行業務、 Cancel: 取消執行業務。
1.1.3.2. 模式特點
- 該模式對代碼的嵌入性高,要求每個業務需要寫三種步驟的操作。
- 該模式對有無本地事務控制都可以支持使用面廣。
- 數據一致性控制幾乎完全由開發者控制,對業務開發難度要求高。
1.1.4. TXC事務模式
1.1.4.1. 原理介紹
- TXC模式命名來源於阿里雲的GTS,實現原理是在執行SQL之前,先查詢SQL的影響數據保存起來然后再執行業務。當需要回滾的時候就采用這些記錄數據回滾事務。
1.1.4.2. 模式特點
- 該模式同樣對代碼的嵌入性低。
- 該模式僅限於對支持SQL方式的模塊支持。
- 該模式由於每次執行SQL之前需要先查詢影響數據,因此相比LCN模式消耗資源與時間要多。
- 該模式不會占用數據庫的連接資源。
1.2. 快速開始
1.2.1. 吐槽
- 坑點一:不要相信官方網站上的的快速開始和示例,不知道是多久以前的了,我搗鼓了很久,下下來的代碼缺斤少兩的,打包了源代碼也滿足不了這示例代碼的需求
- 坑點二:不要直接使用源代碼的tx-manager,肯定仍舊缺少配置,或者和示例代碼版本不一致
- 讓我來個完整的能運行的示例Demo。 ps:也都是從官方github拉的
- 我演示的是4.0的demo,目前也夠用了,5.0的demo我是運行不起來,缺少jar包,有路過的大神知道怎么搞,求教
1.2.2. tx-manager
- 這個tx-manager直接從官方提供的網盤下載,我下的4.1版本的
- 修改配置文件,eureka和redis都整成自己的
- 直接java -jar tx-manager.jar 運行起來就可以了
1.2.3. SpringCloud Demo
- 上述地址為4.0版本的demo,經試驗可以使用
- 我用mybatis-demo這個包做的試驗,里面兩個module,分別修改application.properties,只需要修改數據庫mysql和eureka地址就行
- 當然數據庫別忘了建,建個test庫,新建下列表用於測試
USE test;
DROP TABLE IF EXISTS `t_test`;
CREATE TABLE `t_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
1.3. 使用總結
-
如果需要在自己的項目使用LCN只需要兩步
- 引入pom
<lcn.last.version>4.1.0</lcn.last.version> <dependency> <groupId>com.codingapi</groupId> <artifactId>transaction-springcloud</artifactId> <version>${lcn.last.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.codingapi</groupId> <artifactId>tx-plugins-db</artifactId> <version>${lcn.last.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>- 加一個注解,譬如
@Override @TxTransaction(isStart = true) @Transactional public int save() { int rs2 = demo2Client.save(); int rs1 = testMapper.save("mybatis-hello-1"); // int rs22 = demo2Client.save(); // int v = 100/0; return rs1+rs2; }加上 @TxTransaction(isStart = true) 表示事務開始,在走完整個流程以前,事務都會由tx-manager來協調
1.4. 4.0與5.0版本
- 5.0剛出來沒多久,也就1月份開始大量提交,並已經交由codingApi團隊開發維護,對5.0的使用,或許還要經歷些時間的磨練
- 對上述這個注解,在4.0我找到原代碼是這樣的
/**
* Created by lorne on 2017/6/26.
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TxTransaction {
/**
* 是否LCN事務發起方
* @return true 是:是發起方 false 否:是參與方
*/
boolean isStart() default false;
/**
* 回滾異常
* @return
*/
Class<? extends Throwable>[] rollbackFor() default {};
/**
* 不回滾異常
* @return
*/
Class<? extends Throwable>[] noRollbackFor() default {};
}
- 在5.0我同樣找到了源代碼,是這樣的
/**
* Created by lorne on 2017/6/26.
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TxTransaction {
/**
* 事務模式 transaction type
*
* @return lcn, tcc, txc
* @see Transactions
*/
String type() default Transactions.LCN;
/**
* 分布式事務傳播行為
*
* @return 傳播行為
* @see DTXPropagation
*/
DTXPropagation propagation() default DTXPropagation.REQUIRED;
}
- 很明顯,注解使用和實現都完全變了,4.0和5.0明顯不能兼容了。
- 通過新版本的一堆注解也可以看出來,4.0版本只支持LCN模式,想要嘗試TCC和TXC的,把5.0的Demo去跑通吧

