Seata 包括 Server端和Client端 。Seata中有三種角色:TC、TM、RM,其中,Server端就是TC,TM和RM屬Client端 。Client端的源碼學習上一篇已講過,詳見 《Seata 1.5.2源碼學習》,今天來學習Server端的源碼 。
源碼下載地址:https://github.com/seata/seata
啟動類 ServerApplication 沒什么好說的,重點是ServerRunner

文章插圖
ServerRunner 是一個 CommandLineRunner 實例,因此在Spring Boot啟動完成后會回調(diào)其run()方法 。而在ServerRunner的run()方法中調(diào)用了Server.start()方法 。

文章插圖
在Server#start()方法中,初始化了包括id生成器在內(nèi)的很多組件,我們先不管這些,重點關注以下幾行代碼:
NettyRemotingServer nettyRemotingServer = new NettyRemotingServer(workingThreads);DefaultCoordinator coordinator = DefaultCoordinator.getInstance(nettyRemotingServer);coordinator.init();nettyRemotingServer.setHandler(coordinator);DefaultCoordinator是一個單例Bean,在整個應用中只有一個DefaultCoordinator實例

文章插圖

文章插圖

文章插圖
DefaultCoordinator 實現(xiàn)了 TransactionMessageHandler
NettyRemotingServer#setHandler()設置的正是TransactionMessageHandler

文章插圖
DefaultCoordinator#onRequest()

文章插圖
重點是這三行:
AbstractTransactionRequestToTC transactionRequest = (AbstractTransactionRequestToTC) request;transactionRequest.setTCInboundHandler(this);transactionRequest.handle(context);DefaultCoordinator實現(xiàn)了TCInboundHandler接口,所以它不僅是一個TransactionMessageHandler,還是一個TCInboundHandler
這里transactionRequest.setTCInboundHandler(this),就是指定AbstractTransactionRequestToTC中的TCInboundHandler設置為DefaultCoordinator

文章插圖

文章插圖
AbstractTransactionRequest#handle()

文章插圖
不同的請求分發(fā)給對應的處理器去處理

文章插圖
現(xiàn)在請求和對應的處理器都有了,下面具體看一下每種請求都是如何被處理的
1. 開啟全局事務

文章插圖
開啟事務直接調(diào)用子類DefaultCoordinator#doGlobalBegin(),同時放在一個處理模板中執(zhí)行

文章插圖
在doGlobalBean()中調(diào)用DefaultCore#begin()并返回全局事務ID(xid)

文章插圖
new GlobalSession()

文章插圖
添加一個SessionManager作為Session的監(jiān)聽器

文章插圖
Core

文章插圖
總結一下,開啟事務:
- 創(chuàng)建一個GlobalSession
經(jīng)驗總結擴展閱讀
- 觀察者 CH58X/CH57X/V208 Observer例程討論講解
- Seata 1.5.2 源碼學習
- Sql Server性能排查和優(yōu)化懶人攻略
- 分布式事務框架 Seata 入門案例
- Azure DevOps Server 入門實踐與安裝部署
- 【Serverless】快速集成云函數(shù)HarmonyOS
- Eureka Server 實現(xiàn)在線擴容
- Seata 環(huán)境搭建
- 【Serverless】云函數(shù)微信小程序
- SpringCloud整合分布式事務Seata 1.4.1 支持微服務全局異常攔截
