TX-LCN分佈式事務Demo實戰

1. TX-LCN分佈式事務Demo實戰

1.1. 原理介紹

1.1.1. 事務控制原理

  1. TX-LCN由兩大模塊組成, TxClient、TxManager,TxClient做爲模塊的依賴框架,提供TX-LCN的標準支持,TxManager做爲分佈式事務的控制放。事務發起方或者參與反都由TxClient端來控制。(簡單來講就是單獨部署一套TxManager模塊來實現事務管理,TxClient就是咱們本身的服務系統
  2. 原理圖以下:
    1

1.1.2. LCN事務模式

1.1.2.1. 原理介紹

  1. LCN模式是經過代理Connection的方式實現對本地事務的操做,而後在由TxManager統一協調控制事務。當本地事務提交回滾或者關閉鏈接時將會執行假操做,該代理的鏈接將由LCN鏈接池管理。

1.1.2.2. 模式特色

  1. 該模式對代碼的嵌入性爲低
  2. 該模式僅限於本地存在鏈接對象且可經過鏈接對象控制事務的模塊。
  3. 該模式下的事務提交與回滾是由本地事務方控制,對於數據一致性上有較高的保障
  4. 該模式缺陷在於代理的鏈接須要隨事務發起方一共釋放鏈接,增長了鏈接佔用的時間

1.1.3. TCC事務模式

1.1.3.1. 原理介紹

  1. TCC事務機制相對於傳統事務機制(X/Open XA Two-Phase-Commit),其特徵在於它不依賴資源管理器(RM)對XA的支持,而是經過對(由業務系統提供的)業務邏輯的調度來實現分佈式事務。主要由三步操做,Try: 嘗試執行業務、 Confirm:確認執行業務、 Cancel: 取消執行業務

1.1.3.2. 模式特色

  1. 該模式對代碼的嵌入性高,要求每一個業務須要寫三種步驟的操做。
  2. 該模式對有無本地事務控制均可以支持使用面廣。
  3. 數據一致性控制幾乎徹底由開發者控制,對業務開發難度要求高

1.1.4. TXC事務模式

1.1.4.1. 原理介紹

  1. TXC模式命名來源於阿里雲的GTS,實現原理是在執行SQL以前,先查詢SQL的影響數據保存起來而後再執行業務。當須要回滾的時候就採用這些記錄數據回滾事務

1.1.4.2. 模式特色

  1. 該模式一樣對代碼的嵌入性低
  2. 該模式僅限於對支持SQL方式的模塊支持。
  3. 該模式因爲每次執行SQL以前須要先查詢影響數據,所以相比LCN模式消耗資源與時間要多
  4. 該模式不會佔用數據庫的鏈接資源

1.2. 快速開始

1.2.1. 吐槽

  1. 坑點一:不要相信官方網站上的的快速開始和示例,不知道是多久之前的了,我搗鼓了好久,下下來的代碼缺斤少兩的,打包了源代碼也知足不了這示例代碼的需求
  2. 坑點二:不要直接使用源代碼的tx-manager,確定仍舊缺乏配置,或者和示例代碼版本不一致
  3. 讓我來個完整的能運行的示例Demo。 ps:也都是從官方github拉的
  4. 我演示的是4.0的demo,目前也夠用了,5.0的demo我是運行不起來,缺乏jar包,有路過的大神知道怎麼搞,求教

1.2.2. tx-manager

https://pan.baidu.com/s/1cLKAeE#list/path=%2Fsharelink974324822-625872931897976%2Ftx-manager&parentPath=%2Fsharelink974324822-625872931897976html

  1. 這個tx-manager直接從官方提供的網盤下載,我下的4.1版本的
  2. 修改配置文件,eureka和redis都整成本身的
  3. 直接java -jar tx-manager.jar 運行起來就能夠了

1.2.3. SpringCloud Demo

https://github.com/codingapi/springcloud-lcn-demojava

  1. 上述地址爲4.0版本的demo,經試驗可使用
  2. 我用mybatis-demo這個包作的試驗,裏面兩個module,分別修改application.properties,只須要修改數據庫mysql和eureka地址就行
  3. 固然數據庫別忘了建,建個test庫,新建下列表用於測試
USE test;

DROP TABLE IF EXISTS `t_test`;

CREATE TABLE `t_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

1.3. 使用總結

  1. 若是須要在本身的項目使用LCN只須要兩步
    1. 引入pom
    <lcn.last.version>4.1.0</lcn.last.version>
    
    <dependency>
        <groupId>com.codingapi</groupId>
        <artifactId>transaction-springcloud</artifactId>
        <version>${lcn.last.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <dependency>
        <groupId>com.codingapi</groupId>
        <artifactId>tx-plugins-db</artifactId>
        <version>${lcn.last.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    1. 加一個註解,譬如
    @Override
    @TxTransaction(isStart = true)
    @Transactional
     public int save() {
    
    
        int rs2 = demo2Client.save();
    
        int rs1 = testMapper.save("mybatis-hello-1");
    //        int rs22 = demo2Client.save();
    
    //        int v = 100/0;
    
        return rs1+rs2;
    }
    加上 @TxTransaction(isStart = true) 表示事務開始,在走完整個流程之前,事務都會由tx-manager來協調

1.4. 4.0與5.0版本

  1. 5.0剛出來沒多久,也就1月份開始大量提交,並已經交由codingApi團隊開發維護,對5.0的使用,或許還要經歷些時間的磨練
  2. 對上述這個註解,在4.0我找到原代碼是這樣的
/**
 * Created by lorne on 2017/6/26.
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TxTransaction {


    /**
     * 是否LCN事務發起方
     * @return true 是:是發起方 false 否:是參與方
     */
    boolean isStart() default false;


    /**
     * 回滾異常
     * @return
     */
    Class<? extends Throwable>[] rollbackFor() default {};


    /**
     * 不回滾異常
     * @return
     */
    Class<? extends Throwable>[] noRollbackFor() default {};

}
  1. 在5.0我一樣找到了源代碼,是這樣的
/**
 * Created by lorne on 2017/6/26.
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TxTransaction {


    /**
     * 事務模式 transaction type
     *
     * @return lcn, tcc, txc
     * @see Transactions
     */
    String type() default Transactions.LCN;

    /**
     * 分佈式事務傳播行爲
     *
     * @return 傳播行爲
     * @see DTXPropagation
     */
    DTXPropagation propagation() default DTXPropagation.REQUIRED;
}
  1. 很明顯,註解使用和實現都徹底變了,4.0和5.0明顯不能兼容了。
  2. 經過新版本的一堆註解也能夠看出來,4.0版本只支持LCN模式,想要嘗試TCC和TXC的,把5.0的Demo去跑通吧

1.5. 官方網站

https://www.txlcn.org/zh-cn/docs/start.htmlmysql

相關文章
相關標籤/搜索