本文來自于《精通Spring Cloud Alibaba》課程的整理,講師為餘勝軍,
點選檢視視訊内容。
本文系志願者整理,供配合學習中心課程使用,不做商業用途。
LCN官網基本介紹
http://www.txlcn.org/zh-cn/LCN并不生産事務,LCN隻是本地事務的協調工
LCN基本實作原理
發起方與參與方都與我們的LCN管理器一直保持長連接配接;
發起方在調用接口之前,先向LCN管理器申請一個全局的事務分組id;
發起方調用接口的時候在請求頭中傳遞事務分組id;
參與方擷取到請求頭中有事務分組的id的,則目前業務邏輯執行完實作假關閉,不會送出或者復原目前的事務。
發起方調用完接口後,如果出現異常的情況下,在通知給事務協調者復原事務,這時候事務協調則告訴給參與方復原目前的事務。
SpringBoot整合lcn5.0
Maven依賴
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-txmsg-netty</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
相關配置
application:
###服務的名稱
name: meitemayikt-order
datasource:
url: jdbc:mysql://localhost:3306/order?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
cloud:
nacos:
discovery:
###nacos注冊位址
server-addr: 127.0.0.1:8848
refresh:
refreshable: none
tx-lcn:
client:
manager-address: 127.0.0.1:8070
logger:
enabled: true
用法
參與方與發起方都要加上該注解
@LcnTransaction
@Transactional
源碼核心入口
重新feign用戶端攔截器 RequestInterceptor
Aop的重學的入口TransactionAspect
實作該接口可以在請求之前處理參數SpringTracingApplier
http://127.0.0.1:8090/insertOrder?age=11、Lcn如何判斷自己是發起方還是參與方?
根據目前的線程threadlocal中擷取事務分組id,如果能夠成功擷取到則是為參與方,沒有能夠擷取到就是為發起方。
2、A調用B,B調用C 到底會生産幾次事務id?
A調用 B 調用C 調用D 隻有全局的分組的id 都是有一個局部的事務id
3、參與方如何從請求頭中擷取事務id?如何加入事務組中?
4、LCN如何實作資料源代理實作假關閉?
學習LCN源碼分析的話 入口 @LcnTransaction 必須有AOP才能夠對我們注解生效。
TransactionAspectAop的入口類。
深入了解seata解決分布式事務
Seata簡單介紹
https://github.com/seata/seata https://seata.io/zh-cn/index.html https://github.com/seata/seata/releases/Seata的實作原理
Seata有3個基本組成部分:
事務協調器(TC):維護全局事務和分支事務的狀态,驅動全局送出或復原。
事務管理器TM:定義全局事務的範圍:開始全局事務,送出或復原全局事務。
資料總管(RM):管理分支事務正在處理的資源,與TC進行對話以注冊分支事務并報告分支事務的狀态,并驅動分支事務的送出或復原。