天天看點

SpringCloud 解決分布式事務的兩種方式 | 帶你讀《Spring Cloud Alibaba(2019)》之十九

上一篇:什麼是分布式事務? | 帶你讀《Spring Cloud Alibaba(2019)》之十八

本文來自于《精通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進行對話以注冊分支事務并報告分支事務的狀态,并驅動分支事務的送出或復原。