本文來自於《精通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=1
1、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進行對話以注冊分支事務並報告分支事務的狀態,並驅動分支事務的提交或回滾。
