最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Seata基本使用及二階提交流程

 更新時(shí)間:2025年04月02日 10:30:28   作者:Xwzzz_  
這篇文章主要介紹了關(guān)于Seata基本使用及二階提交流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一,Seata 的基本使用

環(huán)境搭建

  • 下載 Seata:可以從 Seata 官網(wǎng) 或者 GitHub 上獲取最新版本。
  • 啟動(dòng) Seata Server:下載 Seata 后,配置并啟動(dòng) Seata Server,Seata 提供了一個(gè)默認(rèn)的 Nacos 配置中心,也可以使用其他配置中心。

引入依賴

  • 在微服務(wù)應(yīng)用中,可以通過 Maven 或 Gradle 引入 Seata 的相關(guān)依賴。
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.6.1</version> <!-- 根據(jù)需要選擇最新版本 -->
</dependency>

配置 Seata

  • 在使用全局事務(wù)之前,需要確保 Seata Server 已經(jīng)啟動(dòng),并且應(yīng)用程序的 application.yml 配置正確
seata:
  tx-service-group: my_test_tx_group  # 事務(wù)分組
  service:
    vgroup-mapping:
      my_test_tx_group: default
    enable-auto-data-source-proxy: true  # 自動(dòng)代理數(shù)據(jù)源
  registry:
    type: nacos  # 注冊(cè)中心類型
    nacos:
      server-addr: 127.0.0.1:8848  # Nacos 地址
      namespace: public
      group: SEATA_GROUP
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      namespace: public
      group: SEATA_GROUP

在全局事務(wù)中使用 @GlobalTransactional

  • 全局事務(wù)的控制需要在方法上添加 @GlobalTransactional,以確保該方法及其調(diào)用的所有子事務(wù)受 Seata 統(tǒng)一管理。
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class OrderService {

    @Autowired
    private StockService stockService;

    @Autowired
    private PaymentService paymentService;

    @GlobalTransactional(name = "order-create", rollbackFor = Exception.class)
    public void createOrder(String userId, String productId, int amount) {
        // 扣減庫(kù)存
        stockService.deductStock(productId, amount);

        // 處理支付
        paymentService.processPayment(userId, amount);

        // 插入訂單記錄
        System.out.println("訂單創(chuàng)建成功!");
    }
}

在分支事務(wù)中使用 @Transactional

  • Seata 在全局事務(wù)中,所有數(shù)據(jù)庫(kù)操作會(huì)自動(dòng)成為分支事務(wù)。
  • StockService 中:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class StockService {

    @Transactional
    public void deductStock(String productId, int amount) {
        // 執(zhí)行數(shù)據(jù)庫(kù)庫(kù)存扣減操作
        System.out.println("庫(kù)存扣減成功!");
    }
}

雖然 StockService 仍然使用的是本地事務(wù) @Transactional,但因@GlobalTransactional 處于全局事務(wù)上下文中,Seata 會(huì)自動(dòng)代理并管理它的事務(wù)

二,Seata 的工作原理

Seata 通過引入 全局事務(wù)管理分支事務(wù) 來解決分布式系統(tǒng)中的事務(wù)一致性問題。

它使用類似于傳統(tǒng)數(shù)據(jù)庫(kù)事務(wù)中的 二階段提交(2PC,Two-Phase Commit) 協(xié)議來確保事務(wù)的原子性。

二階段提交(2PC)過程

Seata 采用二階段提交協(xié)議(2PC)來確保分布式事務(wù)的一致性。以下是二階段提交的詳細(xì)流程:

1. 第一階段:事務(wù)預(yù)備(Try階段)

  • 全局事務(wù)開始:客戶端應(yīng)用向 Seata Server 發(fā)起請(qǐng)求,Seata 會(huì)生成一個(gè)全局事務(wù) ID(XID),并返回給客戶端應(yīng)用。全局事務(wù)標(biāo)識(shí)用于追蹤整個(gè)分布式事務(wù)。
// 啟動(dòng)全局事務(wù)
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
tx.begin();
  • 分支事務(wù)注冊(cè):每個(gè)參與者(微服務(wù))啟動(dòng)后,會(huì)向 Seata Server 注冊(cè)自己作為一個(gè)分支事務(wù),Seata Server 會(huì)為每個(gè)分支事務(wù)分配一個(gè)唯一的事務(wù)分支 ID(Branch ID)。
  • Try 階段:每個(gè)微服務(wù)會(huì)執(zhí)行 Try 操作,即準(zhǔn)備執(zhí)行本地事務(wù)操作,但不提交數(shù)據(jù)。例如,更新某個(gè)數(shù)據(jù)庫(kù)中的記錄,但不提交。
  • 執(zhí)行數(shù)據(jù)庫(kù)操作:每個(gè)參與的子事務(wù)都會(huì)執(zhí)行數(shù)據(jù)庫(kù)更新,但不會(huì)真正提交,而是進(jìn)入 prepare 狀態(tài)(對(duì)于 AT 模式,這意味著生成 undo_log)。

2. 第二階段:提交(Commit)或回滾(Rollback)

提交(Commit)

  • Seata Server 收到全局事務(wù)提交請(qǐng)求后,通知所有分支事務(wù)提交事務(wù)。
  • 分支事務(wù)提交數(shù)據(jù)庫(kù)操作(刪除 undo_log)。

回滾(Rollback)

  • 如果 Seata Server 發(fā)現(xiàn)某個(gè)分支事務(wù)執(zhí)行失敗,則通知所有已提交的分支事務(wù)回滾,恢復(fù) undo_log 記錄的數(shù)據(jù)。

三,Seata 的四種事務(wù)模式

1. AT 模式(自動(dòng)事務(wù)模式)

AT(Auto Transaction)模式是 Seata 中最常用的分布式事務(wù)模式,適用于對(duì)數(shù)據(jù)庫(kù)執(zhí)行常規(guī)的 CRUD(增、刪、改、查)操作的場(chǎng)景,尤其是簡(jiǎn)單的 SQL 操作。

特點(diǎn)

  • 自動(dòng)化:AT 模式在數(shù)據(jù)庫(kù)的每個(gè)操作上都自動(dòng)代理,開發(fā)者無需顯式地編寫事務(wù)的提交和回滾操作。Seata 會(huì)自動(dòng)插入 undo 日志,在事務(wù)回滾時(shí)自動(dòng)恢復(fù)數(shù)據(jù)庫(kù)的原始狀態(tài)。
  • 無須業(yè)務(wù)代碼改動(dòng):AT 模式的關(guān)鍵優(yōu)勢(shì)是,開發(fā)者無需修改現(xiàn)有的業(yè)務(wù)代碼。通過 Seata 自動(dòng)管理事務(wù),開發(fā)者只需確保數(shù)據(jù)庫(kù)支持 undo 日志(例如 MySQL、Oracle 等)。
  • 僅適用于數(shù)據(jù)庫(kù)操作:AT 模式適用于標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)操作,它依賴于數(shù)據(jù)庫(kù)的日志和 undo 日志機(jī)制。

工作原理

  • Try 階段:Seata 會(huì)攔截?cái)?shù)據(jù)庫(kù)的更新操作,并記錄 undo 日志,但不立即提交。此時(shí),數(shù)據(jù)庫(kù)的數(shù)據(jù)并未真正修改,而是保留了“回滾”的信息。
  • Commit 階段:當(dāng)全局事務(wù)提交時(shí),Seata 會(huì)通過協(xié)調(diào)所有分支事務(wù),最終確認(rèn)提交所有的數(shù)據(jù)修改。
  • Rollback 階段:如果全局事務(wù)失敗,則會(huì)通過回滾所有分支事務(wù)的操作,恢復(fù)數(shù)據(jù)。

適用場(chǎng)景

  • 適用于大多數(shù)微服務(wù)場(chǎng)景,尤其是直接依賴數(shù)據(jù)庫(kù)操作的業(yè)務(wù)邏輯,Seata 會(huì)自動(dòng)進(jìn)行事務(wù)控制。

2. TCC 模式(Try-Confirm-Cancel)

TCC(Try-Confirm-Cancel)模式是一種基于補(bǔ)償?shù)姆植际绞聞?wù)模式,它適用于業(yè)務(wù)操作較為復(fù)雜、涉及多個(gè)服務(wù)的場(chǎng)景。與 AT 模式的自動(dòng)提交和回滾不同,TCC 模式要求開發(fā)者顯式地實(shí)現(xiàn) Try、ConfirmCancel 這三個(gè)階段。

特點(diǎn)

  • 精確控制:開發(fā)者需要編寫 Try、Confirm 和 Cancel 方法,能夠精確控制每個(gè)階段的事務(wù)操作。
  • 高靈活性:TCC 模式適用于復(fù)雜的業(yè)務(wù)操作,尤其是那些需要進(jìn)行資源鎖定、狀態(tài)更新、外部系統(tǒng)調(diào)用的場(chǎng)景。
  • 手動(dòng)補(bǔ)償:TCC 模式的關(guān)鍵是補(bǔ)償機(jī)制,若某個(gè)操作失敗,需要通過 Cancel 操作來撤銷之前的資源占用或狀態(tài)變更。

工作原理

  • Try 階段:執(zhí)行實(shí)際的業(yè)務(wù)操作,但不會(huì)提交(例如,鎖定資源、預(yù)扣資金)。此時(shí),操作是冪等的,并且不改變系統(tǒng)狀態(tài)。
  • Confirm 階段:如果 Try 階段成功,Confirm 階段會(huì)提交操作,確認(rèn)業(yè)務(wù)操作完成(例如,實(shí)際扣款、最終更新庫(kù)存)。
  • Cancel 階段:如果 Try 階段失敗或某個(gè)分支事務(wù)失敗,則執(zhí)行 Cancel 操作,撤銷之前的操作(例如,解鎖資源、退款)。

適用場(chǎng)景

  • 長(zhǎng)時(shí)間執(zhí)行的業(yè)務(wù):例如支付、庫(kù)存扣減等復(fù)雜的跨服務(wù)操作,需要實(shí)現(xiàn)顯式的補(bǔ)償機(jī)制。
  • 必須確保操作的最終一致性:TCC 能夠處理在服務(wù)之間的協(xié)作,并確保每個(gè)服務(wù)能明確知道何時(shí)提交或回滾事務(wù)。

3. SAGA 模式

SAGA(長(zhǎng)事務(wù)模式)是一個(gè)分布式事務(wù)處理模式,適用于跨多個(gè)微服務(wù)的長(zhǎng)事務(wù)。與 TCC 模式不同,SAGA 模式通過將長(zhǎng)事務(wù)拆分成多個(gè)小事務(wù)來保證一致性,每個(gè)小事務(wù)都會(huì)有一個(gè)補(bǔ)償事務(wù)(Compensating Transaction),用于回滾操作。

特點(diǎn)

  • 長(zhǎng)事務(wù)拆分:將大事務(wù)拆分為一系列小事務(wù),每個(gè)小事務(wù)都可以獨(dú)立提交或回滾。
  • 補(bǔ)償機(jī)制:每個(gè)小事務(wù)都需要實(shí)現(xiàn)一個(gè)補(bǔ)償事務(wù),當(dāng)某個(gè)事務(wù)失敗時(shí),通過補(bǔ)償事務(wù)來撤銷之前的操作。
  • 可以異步執(zhí)行:每個(gè)子事務(wù)之間可以獨(dú)立執(zhí)行,并且可以異步執(zhí)行,不需要像 TCC 那樣鎖定資源。

工作原理

  • 子事務(wù):將全局事務(wù)拆分為多個(gè)子事務(wù),每個(gè)子事務(wù)執(zhí)行獨(dú)立的操作(例如,支付、庫(kù)存扣減等)。
  • 補(bǔ)償操作:每個(gè)子事務(wù)都有相應(yīng)的補(bǔ)償操作。如果某個(gè)子事務(wù)失敗,執(zhí)行補(bǔ)償操作撤銷之前的操作。
  • 全局事務(wù)結(jié)束:當(dāng)所有子事務(wù)都執(zhí)行成功時(shí),結(jié)束整個(gè) SAGA 事務(wù);如果某個(gè)子事務(wù)失敗,則根據(jù)補(bǔ)償規(guī)則進(jìn)行回滾。

適用場(chǎng)景

  • 長(zhǎng)時(shí)間的、跨多個(gè)服務(wù)的事務(wù):例如訂單的創(chuàng)建、支付、發(fā)貨等操作。
  • 能夠容忍部分失敗的場(chǎng)景:SAGA 模式適用于業(yè)務(wù)流程中的某些操作失敗后,可以通過補(bǔ)償機(jī)制修復(fù)的場(chǎng)景。

4. XA 模式(原生分布式事務(wù))

XA 模式是傳統(tǒng)的分布式事務(wù)協(xié)議,它基于 XA協(xié)議,是一種強(qiáng)一致性的分布式事務(wù)模式。Seata 的 XA 模式要求參與者支持 XA 事務(wù)協(xié)議,例如數(shù)據(jù)庫(kù)、消息隊(duì)列等。

特點(diǎn)

  • 強(qiáng)一致性:XA 模式是最嚴(yán)格的分布式事務(wù)協(xié)議,確保所有分布式事務(wù)的最終一致性。
  • 兩階段提交協(xié)議(2PC):與 AT 模式類似,XA 模式也采用了 2PC 協(xié)議來管理事務(wù)一致性。
  • 依賴于底層數(shù)據(jù)庫(kù)的支持:必須使用支持 XA 事務(wù)的數(shù)據(jù)庫(kù)(例如,MySQL、Oracle 等)。

工作原理

  • 第一階段(Prepare):所有參與者準(zhǔn)備提交事務(wù),但不提交。
  • 第二階段(Commit/Rollback):如果所有參與者都準(zhǔn)備好,則提交事務(wù),否則回滾事務(wù)。

適用場(chǎng)景

  • 嚴(yán)格要求強(qiáng)一致性的場(chǎng)景:例如銀行轉(zhuǎn)賬等對(duì)事務(wù)一致性要求極高的業(yè)務(wù)。

總結(jié)

Seata 支持以下四種分布式事務(wù)模式:

  1. AT 模式:適用于標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)操作,自動(dòng)管理事務(wù),適合不涉及復(fù)雜業(yè)務(wù)邏輯的場(chǎng)景。
  2. TCC 模式:適用于跨多個(gè)服務(wù)的復(fù)雜業(yè)務(wù),需要手動(dòng)編寫補(bǔ)償邏輯。
  3. SAGA 模式:適用于長(zhǎng)事務(wù),適合拆分為多個(gè)子事務(wù)的場(chǎng)景,每個(gè)子事務(wù)都可以獨(dú)立回滾。
  4. XA 模式:嚴(yán)格一致性的分布式事務(wù)協(xié)議,適用于需要強(qiáng)一致性的場(chǎng)景,如金融交易等。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springMVC的生命周期詳解

    springMVC的生命周期詳解

    本篇文章主要介紹了springMVC的生命周期詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請(qǐng)求方法詳解

    java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請(qǐng)求方法詳解

    這篇文章主要介紹了java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請(qǐng)求方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 零基礎(chǔ)寫Java知乎爬蟲之抓取知乎答案

    零基礎(chǔ)寫Java知乎爬蟲之抓取知乎答案

    上篇文章我們已經(jīng)能把知乎的問題抓出來了,但是答案還木有抓出來。這一回合,我們就連著把答案也一起從網(wǎng)站中摳出來=。=
    2014-11-11
  • Java快速實(shí)現(xiàn)Excel表格轉(zhuǎn)SVG的示例詳解

    Java快速實(shí)現(xiàn)Excel表格轉(zhuǎn)SVG的示例詳解

    對(duì)于開發(fā)者來說,使用 Java 來實(shí)現(xiàn) Excel 到 SVG 的轉(zhuǎn)換,是一種更靈活、可控的方式,本文將演示如何通過簡(jiǎn)單的 Java 代碼完成這一過程,希望對(duì)大家有所幫助
    2025-09-09
  • springboot之excel工具類使用及說明

    springboot之excel工具類使用及說明

    本文介紹了一個(gè)批量處理Excel數(shù)據(jù)的小工具,提供導(dǎo)入導(dǎo)出功能,通過定義數(shù)據(jù)類和處理函數(shù)即可實(shí)現(xiàn)數(shù)據(jù)處理,最后進(jìn)行模擬請(qǐng)求和文件數(shù)據(jù)生成,以測(cè)試工具的正確性
    2026-04-04
  • springBoot?啟動(dòng)指定配置文件環(huán)境多種方案(最新推薦)

    springBoot?啟動(dòng)指定配置文件環(huán)境多種方案(最新推薦)

    springBoot?啟動(dòng)指定配置文件環(huán)境理論上是有多種方案的,一般都是結(jié)合我們的實(shí)際業(yè)務(wù)選擇不同的方案,比如,有pom.xml文件指定、maven命令行指定、配置文件指定、啟動(dòng)jar包時(shí)指定等方案,今天我們一一分享一下,需要的朋友可以參考下
    2023-09-09
  • Java AtomicInteger類的使用方法詳解

    Java AtomicInteger類的使用方法詳解

    這篇文章主要介紹了Java AtomicInteger類的使用方法詳解,文中有具體實(shí)例代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • 關(guān)于Spring組成的七大模塊詳解

    關(guān)于Spring組成的七大模塊詳解

    Spring是一個(gè)開源的應(yīng)用框架,用于簡(jiǎn)化企業(yè)級(jí)應(yīng)用開發(fā),它由核心容器、應(yīng)用上下文、面向切面編程、JDBC和DAO模塊、對(duì)象實(shí)體映射、Web模塊和MVC模塊七大模塊組成,這些模塊提供了各種功能,如依賴注入、面向切面編程、ORM支持、Web開發(fā)等,以幫助開發(fā)者更高效地開發(fā)應(yīng)用
    2025-11-11
  • Java數(shù)組的定義、初始化、及二維數(shù)組用法分析

    Java數(shù)組的定義、初始化、及二維數(shù)組用法分析

    這篇文章主要介紹了Java數(shù)組的定義、初始化、及二維數(shù)組用法,結(jié)合具體實(shí)例形式分析了java數(shù)組概念、功能、數(shù)組定義、靜態(tài)數(shù)組、動(dòng)態(tài)數(shù)組、二維數(shù)組等相關(guān)使用技巧,需要的朋友可以參考下
    2019-01-01
  • 如何解決struts2日期類型轉(zhuǎn)換

    如何解決struts2日期類型轉(zhuǎn)換

    在Struts2中,一般的內(nèi)置類型都會(huì)在由系統(tǒng)自動(dòng)進(jìn)行轉(zhuǎn)換.但是Date類型好像有時(shí)候行,有時(shí)候不行。比如我這次,本地運(yùn)行正常,一上測(cè)試服務(wù)器就不行了。這個(gè)轉(zhuǎn)換類是從網(wǎng)上看的:
    2013-03-03

最新評(píng)論

武川县| 达拉特旗| 旬邑县| 专栏| 滦南县| 尉氏县| 吉木乃县| 东乌珠穆沁旗| 武汉市| 沙坪坝区| 黄骅市| 枣强县| 灵丘县| 平山县| 班玛县| 横山县| 金乡县| 柘荣县| 莱芜市| 奉贤区| 三都| 都江堰市| 荥阳市| 库伦旗| 元谋县| 通州区| 新干县| 理塘县| 乌鲁木齐市| 桐柏县| 肥乡县| 东辽县| 英德市| 津南区| 涿鹿县| 奎屯市| 玉环县| 阳城县| 陈巴尔虎旗| 安宁市| 宜城市|