什么是TX-LCN
TX-LCN定位於一款事務協調性框架,框架其本身並不操作事務,而是基於對事務的協調從而達到事務一致性的效果。
TX-LCN 主要有兩個模塊,Tx-Client(TC) Tx-Manager(TM). TC作為微服務下的依賴,TM是獨立的服務。
TX-LCN原理

-
核心步驟:
創建事務組: 是指在事務發起方開始執行業務代碼之前先調用TxManager創建事務組對象,然后拿到事務標示GroupId的過程。 加入事務組: 添加事務組是指參與方在執行完業務方法以后,將該模塊的事務信息通知給TxManager的操作。 通知事務組: 是指在發起方執行完業務代碼以后,將發起方執行結果狀態通知給TxManager,TxManager將根據事務最終狀態和事務組的信息來通知相應的參與模塊提交或回滾事務, 並返回結果給事務發起方。
TX-LCN項目調用架構

由項目調用架構圖可以看出來,TM
需要使用的Redis
,所以我們需要准備一台Redis
TM環境搭建
1、創建一個SpringBoot
項目,lcn-tm
添加如下依賴,並且在啟動類上添加注解@EnableTransactionManagerServer
<dependency>
<groupId>com.codingapi.txlcngroupId>
<artifactId>txlcn-tmartifactId>
<version>5.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>com.codingapi.txlcngroupId>
<artifactId>txlcn-tcartifactId>
<version>5.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>com.codingapi.txlcngroupId>
<artifactId>txlcn-txmsg-nettyartifactId>
<version>5.0.2.RELEASEversion>
dependency>
2、創建數據庫tx-manager
並且執行如下腳本,TM
需要 t_tx_exception
和t_logger
倆張表
CREATE TABLE `t_tx_exception` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` varchar(32) DEFAULT NULL,
`unit_id` varchar(32) DEFAULT NULL,
`mod_id` varchar(32) DEFAULT NULL,
`transaction_state` tinyint(4) DEFAULT NULL,
`registrar` tinyint(4) DEFAULT NULL COMMENT '-1 未知 0 Manager 通知事務失敗, 1 client詢問事務狀態失敗2 事務發起方關閉事務組失敗',
`ex_state` tinyint(4) DEFAULT NULL COMMENT '0 待處理 1已處理',
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
CREATE TABLE `t_logger` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` varchar(64) NOT NULL,
`unit_id` varchar(32) NOT NULL,
`tag` varchar(50) NOT NULL,
`content` varchar(1024) NOT NULL,
`create_time` varchar(30) NOT NULL,
`app_name` varchar(128) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
3、配置TM
服務,在項目lcn-tm
的配置文件application.properties
(注意目前只支持properties
文件格式)添加如下配置
server.port=7970
TM事務管理器,需要訪問數據庫,實現分布式事務狀態記錄。
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=rootTM事務管理器,是依賴Redis使用分布式事務協調的。尤其是TCC和TXC兩種事務模型。
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=0為spring應用起名。
spring.application.name=tx-lcn-transaction-manager
TM事務管理器,提供的WEB管理平台的登錄密碼。無用戶名。 默認是codingapi
tx-lcn.manager.admin-key=triumphxx
日志。如果需要TM記錄日志。則開啟,賦值為true,並提供后續的配置。
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true日志。如果需要TM記錄日志。則開啟,賦值為true,並提供后續的配置。
tx-lcn.logger.enabled=true
TxManager Host Ip
tx-lcn.manager.host=127.0.0.1
TxClient連接請求端口
tx-lcn.manager.port=8070
心跳檢測時間(ms)
tx-lcn.manager.heart-time=15000
分布式事務執行總時間
tx-lcn.manager.dtx-time=300000
參數延遲刪除時間單位ms
tx-lcn.message.netty.attr-delay-time=10000
tx-lcn.manager.concurrent-level=128開啟日志
logging.level.com.codingapi=debug
為日志功能,提供數據庫連接,和前面的使用的不是一個數據源
tx-lcn.logger.driver-class-name=com.mysql.cj.jdbc.Driver
tx-lcn.logger.jdbc-url=jdbc:mysql://localhost:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
tx-lcn.logger.username=root
tx-lcn.logger.password=root
4、啟動項目lcn-tm
訪問http://localhost:7970/
出現如下畫面,表示TM
服務搞定

5、輸入配置文件中配置的密碼tx-lcn.manager.admin-key=triumphxx
就能夠登錄

以上就是TX-LCN
的基本介紹和TM
的搭建
TC環境搭建
由於我們是微服務,所以需要創建一個注冊中心,我們就用Eureka
來搭建,項目為eureka-server
,這里就不贅述了,還需要創建倆個項目來模擬分布式事務的場景, 分別為lcn-order
訂單服務和lcn-pay
支付服務。
1、在訂單服務支付服務中添加如下依賴,並且在啟動類上添加注解@EnableDistributedTransaction
表示開啟分布式事務
<dependency>
<groupId>com.codingapi.txlcngroupId>
<artifactId>txlcn-tcartifactId>
<version>5.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>com.codingapi.txlcngroupId>
<artifactId>txlcn-txmsg-nettyartifactId>
<version>5.0.2.RELEASEversion>
dependency>
2.配置TC
,在yaml
文件中接入如下配置,表示連接的TM
信息
tx-lcn:
client:
manager-address: 127.0.0.1:8070
3、啟動TC
,登錄到TM
管理后台可以看到注冊的TC
,以及點擊詳細信息可以看到TC
的詳細信息
-
注冊信息
-
詳細信息
以上就是TX-LCN
TC
的搭建
總結
以上就是TX-LCN
的介紹以及環境的搭建,后面我們討論TX-LCN
的幾種模式。
