欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java分布式事務(wù)管理框架之Seata

 更新時(shí)間:2022年07月29日 10:48:51   作者:kaico2018  
這篇文章主要介紹了Java分布式事務(wù)框架Seata,分布式事務(wù)是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點(diǎn)之上

Seata介紹

Seata:Simple Extensible Autonomous Transaction Architecture,簡(jiǎn)易可擴(kuò)展的自治式分布式事務(wù)管理框架,其前身是fescar。是一種簡(jiǎn)單分布式事務(wù)的解決方案。Seata 是一款開(kāi)源的分布式事務(wù)解決方案,致力于提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務(wù)模式,為用戶打造一站式的分布式解決方案。

官方文檔:https://seata.io/zh-cn/docs/overview/what-is-seata.html

三大組件

事務(wù)協(xié)調(diào)器(TC):維護(hù)全局事務(wù)和分支事務(wù)的狀態(tài),驅(qū)動(dòng)全局提交或回滾,相當(dāng)于是協(xié)調(diào)者。

事務(wù)管理器(TM):定義全局事務(wù)的范圍:開(kāi)始全局事務(wù),提交或回滾全局事務(wù),相當(dāng)于LCN中發(fā)起方。

資源管理器(RM):管理分支事務(wù)正在處理的資源,與TC進(jìn)行對(duì)話以注冊(cè)分支事務(wù)并報(bào)告分支事務(wù)的狀態(tài),并驅(qū)動(dòng)分支事務(wù)的提交或回滾,相當(dāng)于是LCN中的參與方

實(shí)現(xiàn)原理

  • 發(fā)起方™和我們的參與方(RM)項(xiàng)目啟動(dòng)之后和協(xié)調(diào)者TC保持長(zhǎng)連接;
  • 發(fā)起方™調(diào)用接口之前向TC獲取一個(gè)全局的事務(wù)的id 為xid,注冊(cè)到 seata 中.Aop實(shí)現(xiàn)
  • 使用feign客戶端調(diào)用接口的時(shí)候,seata重寫了feign客戶端,在請(qǐng)求中傳遞該xid。
  • 參與方(RM)從請(qǐng)求頭中獲取到該xid,方法執(zhí)行完后不會(huì)立馬提交而是等待協(xié)調(diào)者告訴提交狀態(tài)。

四種事務(wù)模式

第一種、AT

使用這種模式有個(gè)前提:

  • 基于支持本地 ACID 事務(wù)的關(guān)系型數(shù)據(jù)庫(kù)。
  • Java 應(yīng)用,通過(guò) JDBC 訪問(wèn)數(shù)據(jù)庫(kù)。

實(shí)現(xiàn)過(guò)程分為兩個(gè)階段:

一階段:

在一階段中,Seata會(huì)攔截“業(yè)務(wù)SQL“,首先解析SQL語(yǔ)義,找到要更新的業(yè)務(wù)數(shù)據(jù),在數(shù)據(jù)被更新前,保存下來(lái)"undo",然后執(zhí)行”業(yè)務(wù)SQL“更新數(shù)據(jù),更新之后再次保存數(shù)據(jù)”redo“,最后生成行鎖,這些操作都在本地?cái)?shù)據(jù)庫(kù)事務(wù)內(nèi)完成,這樣保證了一階段的原子性。

  • 解析 SQL:得到 SQL 的類型(UPDATE),表(product),條件(where name = ‘TXC’)等相關(guān)的信息。
  • 查詢前鏡像:根據(jù)解析得到的條件信息,生成查詢語(yǔ)句,定位數(shù)據(jù)。
  • 執(zhí)行業(yè)務(wù) SQL:更新這條記錄的 name 為 ‘GTS’。
  • 查詢后鏡像:根據(jù)前鏡像的結(jié)果,通過(guò) 主鍵 定位數(shù)據(jù)。
  • 插入回滾日志:把前后鏡像數(shù)據(jù)以及業(yè)務(wù) SQL 相關(guān)的信息組成一條回滾日志記錄,插入到 UNDO_LOG 表中。
  • 提交前,向 TC 注冊(cè)分支:申請(qǐng) product 表中,主鍵值等于 1 的記錄的 全局鎖 。
  • 本地事務(wù)提交:業(yè)務(wù)數(shù)據(jù)的更新和前面步驟中生成的 UNDO LOG 一并提交。
  • 將本地事務(wù)提交的結(jié)果上報(bào)給 TC。

二階段:

相對(duì)一階段,二階段比較簡(jiǎn)單,負(fù)責(zé)整體的回滾和提交,如果之前的一階段中有本地事務(wù)沒(méi)有通過(guò),那么就執(zhí)行全局回滾,否在執(zhí)行全局提交,回滾用到的就是一階段記錄的"undo Log",通過(guò)回滾記錄生成反向更新SQL并執(zhí)行,以完成分支的回滾。當(dāng)然事務(wù)完成后會(huì)釋放所有資源和刪除所有日志。

事務(wù)回滾的情況

  • 收到 TC 的分支回滾請(qǐng)求,開(kāi)啟一個(gè)本地事務(wù),執(zhí)行如下操作。
  • 通過(guò) XID 和 Branch ID 查找到相應(yīng)的 UNDO LOG 記錄。
  • 數(shù)據(jù)校驗(yàn):拿 UNDO LOG 中的后鏡與當(dāng)前數(shù)據(jù)進(jìn)行比較,如果有不同,說(shuō)明數(shù)據(jù)被當(dāng)前全局事務(wù)之外的動(dòng)作做了修改。這種情況,需要根據(jù)配置策略來(lái)做處理
  • 根據(jù) UNDO LOG 中的前鏡像和業(yè)務(wù) SQL 的相關(guān)信息生成并執(zhí)行回滾的語(yǔ)句
  • 提交本地事務(wù)。并把本地事務(wù)的執(zhí)行結(jié)果(即分支事務(wù)回滾的結(jié)果)上報(bào)給 TC。

事務(wù)提交的情況

  • 收到 TC 的分支提交請(qǐng)求,把請(qǐng)求放入一個(gè)異步任務(wù)的隊(duì)列中,馬上返回提交成功的結(jié)果給 TC。
  • 異步任務(wù)階段的分支提交請(qǐng)求將異步和批量地刪除相應(yīng) UNDO LOG 記錄。

**總結(jié):**AT模式是一種無(wú)侵入的分布式事務(wù)解決方案,在 AT 模式下,用戶只需關(guān)注自己的“業(yè)務(wù) SQL”,用戶的 “業(yè)務(wù) SQL” 作為一階段,Seata 框架會(huì)自動(dòng)生成事務(wù)的二階段提交和回滾操作。該模式會(huì)根據(jù)用戶執(zhí)行的SQL生成對(duì)應(yīng)的回滾數(shù)據(jù)的SQL語(yǔ)句,然后根據(jù)事務(wù)的提交還是回滾來(lái)執(zhí)行回滾的SQL語(yǔ)句還是刪除對(duì)應(yīng)的UNDO LOG 記錄(SQL語(yǔ)句)。

第二種、TCC

不依賴于底層數(shù)據(jù)資源的事務(wù)支持:是指支持把 自定義 的分支事務(wù)納入到全局事務(wù)的管理中。

一階段 prepare 行為:調(diào)用 自定義 的 prepare 邏輯。
二階段 commit 行為:調(diào)用 自定義 的 commit 邏輯。
二階段 rollback 行為:調(diào)用 自定義 的 rollback 邏輯。

第三種、Saga

Saga模式是SEATA提供的長(zhǎng)事務(wù)解決方案,在Saga模式中,業(yè)務(wù)流程中每個(gè)參與者都提交本地事務(wù),當(dāng)出現(xiàn)某一個(gè)參與者失敗則補(bǔ)償前面已經(jīng)成功的參與者,一階段正向服務(wù)和二階段補(bǔ)償服務(wù)都由業(yè)務(wù)開(kāi)發(fā)實(shí)現(xiàn)。

第四種、XA

在 Seata 定義的分布式事務(wù)框架內(nèi),利用事務(wù)資源(數(shù)據(jù)庫(kù)、消息服務(wù)等)對(duì) XA 協(xié)議的支持,以 XA 協(xié)議的機(jī)制來(lái)管理分支事務(wù)的一種事務(wù)模式。

使用前提:支持XA 事務(wù)的數(shù)據(jù)庫(kù)。Java 應(yīng)用,通過(guò) JDBC 訪問(wèn)數(shù)據(jù)庫(kù)。

這里主要介紹使用AT模式,后續(xù)提供每種模式的實(shí)現(xiàn)方式、代碼案例。

搭建seata服務(wù)端

單機(jī)版安裝

下載地址:https://github.com/seata/seata/releases

這里使用的是1.4.2版本

學(xué)習(xí)和測(cè)試建議使用單機(jī)版,簡(jiǎn)單搭建,生成環(huán)境不建議。

直接在github上下載對(duì)應(yīng)的軟件包,一鍵啟動(dòng)即可,默認(rèn)是file模式,也就是數(shù)據(jù)以文件的形式保存本地。

解壓之后,進(jìn)入bin目錄執(zhí)行對(duì)應(yīng)的啟動(dòng)命令即可:windows環(huán)境執(zhí)行 bat文件,Linux環(huán)境執(zhí)行 sh文件。

啟動(dòng)成功:

數(shù)據(jù)保存在本地

集群安裝

首先準(zhǔn)備mysql、nacos環(huán)境,在準(zhǔn)備至少兩臺(tái)服務(wù)器,這里數(shù)據(jù)存到MySQL中去。

多個(gè) Seata TC Server 通過(guò) db 數(shù)據(jù)庫(kù),實(shí)現(xiàn)全局事務(wù)會(huì)話信息的共享。同時(shí),每個(gè) Seata TC Server 可以注冊(cè)自己到注冊(cè)中心上,方便應(yīng)用從注冊(cè)中心獲得到他們。

初始化SQL語(yǔ)句(可以去github中找到,源碼中也有),seata框架需要用的數(shù)據(jù)庫(kù)表

CREATE TABLE IF NOT EXISTS `global_table`
(
    `xid`                       VARCHAR(128) NOT NULL,
    `transaction_id`            BIGINT,
    `status`                    TINYINT      NOT NULL,
    `application_id`            VARCHAR(32),
    `transaction_service_group` VARCHAR(32),
    `transaction_name`          VARCHAR(128),
    `timeout`                   INT,
    `begin_time`                BIGINT,
    `application_data`          VARCHAR(2000),
    `gmt_create`                DATETIME,
    `gmt_modified`              DATETIME,
    PRIMARY KEY (`xid`),
    KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               VARCHAR(128) NOT NULL,
    `transaction_id`    BIGINT,
    `resource_group_id` VARCHAR(32),
    `resource_id`       VARCHAR(256),
    `branch_type`       VARCHAR(8),
    `status`            TINYINT,
    `client_id`         VARCHAR(64),
    `application_data`  VARCHAR(2000),
    `gmt_create`        DATETIME(6),
    `gmt_modified`      DATETIME(6),
    PRIMARY KEY (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;
-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

每個(gè)seata服務(wù)節(jié)點(diǎn)的配置信息修改:主要修改下面兩個(gè)文件

file.conf文件的修改:注意mysql 的版本,我這里使用的是MySQL8

store {
  ## store mode: file、db、redis
  mode = "db"
  ## rsa decryption public key
  publicKey = ""
  ## database store property
  db {
    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
    datasource = "druid"
    ## mysql/oracle/postgresql/h2/oceanbase etc.
    dbType = "mysql"
    driverClassName = "com.mysql.cj.jdbc.Driver"
    ## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
    url = "jdbc:mysql://www.kaicostudy.com:3306/transaction_seata?rewriteBatchedStatements=true"
    user = "root"
    password = "123456"
    minConn = 5
    maxConn = 100
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
}

registry.conf 文件的修改:

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
    application = "seata-server"
    serverAddr = "www.kaicostudy.com:8848"
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "default"
    username = ""
    password = ""
  }
}

config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
    serverAddr = "www.kaicostudy.com:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = ""
    password = ""
    dataId = "seataServer.properties"
  }
}

修改好每個(gè)seata服務(wù)節(jié)點(diǎn)的配置信息后,正常一次啟動(dòng)seata服務(wù)就可以了。之后可以在nacos看到seata服務(wù)的信息。

到此這篇關(guān)于Java分布式事務(wù)管理框架之Seata的文章就介紹到這了,更多相關(guān)Java Seata內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot?整合hbase的示例代碼

    springboot?整合hbase的示例代碼

    這篇文章主要介紹了springboot?整合hbase的示例代碼,本篇詳細(xì)總結(jié)了hbase的Java客戶端的使用,在實(shí)際開(kāi)發(fā)過(guò)程中,還需要結(jié)合自身的情況做更加細(xì)致的整合與優(yōu)化,需要的朋友可以參考下
    2022-04-04
  • Java序列化機(jī)制與原理的深入分析

    Java序列化機(jī)制與原理的深入分析

    有關(guān)Java對(duì)象的序列化和反序列化也算是Java基礎(chǔ)的一部分,下面對(duì)Java序列化的機(jī)制和原理進(jìn)行一些介紹
    2013-05-05
  • SpringBoot敏感數(shù)據(jù)脫敏的處理方式

    SpringBoot敏感數(shù)據(jù)脫敏的處理方式

    在Spring Boot中處理敏感數(shù)據(jù)脫敏,可以通過(guò)以下幾種方式實(shí)現(xiàn),確保敏感信息在接口返回、日志輸出、數(shù)據(jù)庫(kù)存儲(chǔ)等環(huán)節(jié)得到保護(hù),文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • maven中的scope與systemPath用法

    maven中的scope與systemPath用法

    這篇文章主要介紹了maven中的scope與systemPath用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Apache DolphinScheduler實(shí)現(xiàn)自動(dòng)化打包單機(jī)/集群部署詳解

    Apache DolphinScheduler實(shí)現(xiàn)自動(dòng)化打包單機(jī)/集群部署詳解

    這篇文章主要為大家介紹了Apache DolphinScheduler實(shí)現(xiàn)自動(dòng)化打包單機(jī)/集群部署詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • SpringBoot鉤子函數(shù)的實(shí)現(xiàn)示例

    SpringBoot鉤子函數(shù)的實(shí)現(xiàn)示例

    SpringBoot雖然沒(méi)有直接稱為“鉤子函數(shù)”的概念,但可以其他方法實(shí)現(xiàn),本文就來(lái)介紹一下SpringBoot鉤子函數(shù)的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-11-11
  • java基本教程之常用的實(shí)現(xiàn)多線程的兩種方式 java多線程教程

    java基本教程之常用的實(shí)現(xiàn)多線程的兩種方式 java多線程教程

    下面開(kāi)始學(xué)習(xí)“常用的實(shí)現(xiàn)多線程的2種方式”:Thread 和 Runnable。之所以說(shuō)是常用的,是因?yàn)橥ㄟ^(guò)還可以通過(guò)java.util.concurrent包中的線程池來(lái)實(shí)現(xiàn)多線程
    2014-01-01
  • springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    下面小編就為大家分享一篇springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • java實(shí)現(xiàn)批量下載 多文件打包成zip格式下載

    java實(shí)現(xiàn)批量下載 多文件打包成zip格式下載

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)批量下載、將多文件打包成zip格式下載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 在SpringBoot中整合數(shù)據(jù)源的示例詳解

    在SpringBoot中整合數(shù)據(jù)源的示例詳解

    這篇文章主要介紹了在SpringBoot中如何整合數(shù)據(jù)源,本文介紹了如何在SpringBoot項(xiàng)目中整合常見(jiàn)的數(shù)據(jù)源,包括JdbcTemplate、MyBatis和JPA,并探討了如何配置和使用多數(shù)據(jù)源,需要的朋友可以參考下
    2023-06-06

最新評(píng)論