精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

對(duì)比 5 種分布式事務(wù)方案,還是寵幸了阿里的 Seata(原理 + 實(shí)戰(zhàn))

開發(fā) 前端 分布式
我們先看看百度上對(duì)于分布式事務(wù)的定義:分布式事務(wù)是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點(diǎn)之上。

[[354367]]

本文轉(zhuǎn)載自微信公眾號(hào)「 程序員內(nèi)點(diǎn)事」,作者 程序員內(nèi)點(diǎn)事。轉(zhuǎn)載本文請(qǐng)聯(lián)系 程序員內(nèi)點(diǎn)事公眾號(hào)。

好長(zhǎng)時(shí)間沒發(fā)文了,最近著實(shí)是有點(diǎn)忙,當(dāng)?shù)牡?43 天,身心疲憊。這又趕上年底,公司沖KPI 強(qiáng)制技術(shù)部加班到十點(diǎn),晚上孩子隔兩三個(gè)小時(shí)一醒,基本沒睡囫圇覺的機(jī)會(huì),天天處于迷糊的狀態(tài),孩子還時(shí)不時(shí)起一些奇奇怪怪的疹子,總讓人擔(dān)驚受怕的。

本就不多的寫文章時(shí)間又被無限分割,哎~ 打工人真是太難了。

小眼神幾個(gè)意思

 

本來不知道寫點(diǎn)啥,正好手頭有個(gè)新項(xiàng)目試著用阿里的 Seata 中間件做分布式事務(wù),那就做一個(gè)實(shí)踐分享吧!

介紹 Seata 之前在簡(jiǎn)單回顧一下分布式事務(wù)的基本概念。

分布式事務(wù)的產(chǎn)生

我們先看看百度上對(duì)于分布式事務(wù)的定義:分布式事務(wù)是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點(diǎn)之上。

 

額~ 有點(diǎn)抽象,簡(jiǎn)單的畫個(gè)圖好理解一下,拿下單減庫(kù)存、扣余額來說舉例:

當(dāng)系統(tǒng)的體量很小時(shí),單體架構(gòu)完全可以滿足現(xiàn)有業(yè)務(wù)需求,所有的業(yè)務(wù)共用一個(gè)數(shù)據(jù)庫(kù),整個(gè)下單流程或許只用在一個(gè)方法里同一個(gè)事務(wù)下操作數(shù)據(jù)庫(kù)即可。此時(shí)做到所有操作要么全部提交 或 要么全部回滾很容易。

 

分庫(kù)分表、SOA

可隨著業(yè)務(wù)量的不斷增長(zhǎng),單體架構(gòu)漸漸扛不住巨大的流量,此時(shí)就需要對(duì)數(shù)據(jù)庫(kù)、表做 分庫(kù)分表處理,將應(yīng)用 SOA 服務(wù)化拆分。也就產(chǎn)生了訂單中心、用戶中心、庫(kù)存中心等,由此帶來的問題就是業(yè)務(wù)間相互隔離,每個(gè)業(yè)務(wù)都維護(hù)著自己的數(shù)據(jù)庫(kù),數(shù)據(jù)的交換只能進(jìn)行RPC 調(diào)用。

當(dāng)用戶再次下單時(shí),需同時(shí)對(duì)訂單庫(kù) order、庫(kù)存庫(kù) storage、用戶庫(kù) account 進(jìn)行操作,可此時(shí)我們只能保證自己本地的數(shù)據(jù)一致性,無法保證調(diào)用其他服務(wù)的操作是否成功,所以為了保證整個(gè)下單流程的數(shù)據(jù)一致性,就需要分布式事務(wù)介入。

 

Seata 優(yōu)勢(shì)

實(shí)現(xiàn)分布式事務(wù)的方案比較多,常見的比如基于 XA 協(xié)議的 2PC、3PC,基于業(yè)務(wù)層的TCC,還有應(yīng)用消息隊(duì)列 + 消息表實(shí)現(xiàn)的最終一致性方案,還有今天要說的 Seata 中間件,下邊看看各個(gè)方案的優(yōu)缺點(diǎn)。

2PC

基于 XA 協(xié)議實(shí)現(xiàn)的分布式事務(wù),XA 協(xié)議中分為兩部分:事務(wù)管理器和本地資源管理器。其中本地資源管理器往往由數(shù)據(jù)庫(kù)實(shí)現(xiàn),比如 Oracle、MYSQL 這些數(shù)據(jù)庫(kù)都實(shí)現(xiàn)了 XA 接口,而事務(wù)管理器則作為一個(gè)全局的調(diào)度者。

兩階段提交(2PC),對(duì)業(yè)務(wù)侵⼊很小,它最⼤的優(yōu)勢(shì)就是對(duì)使⽤⽅透明,用戶可以像使⽤本地事務(wù)⼀樣使⽤基于 XA 協(xié)議的分布式事務(wù),能夠嚴(yán)格保障事務(wù) ACID 特性。

 

可 2PC的缺點(diǎn)也是顯而易見,它是一個(gè)強(qiáng)一致性的同步阻塞協(xié)議,事務(wù)執(zhí)⾏過程中需要將所需資源全部鎖定,也就是俗稱的 剛性事務(wù)。所以它比較適⽤于執(zhí)⾏時(shí)間確定的短事務(wù),整體性能比較差。

一旦事務(wù)協(xié)調(diào)者宕機(jī)或者發(fā)生網(wǎng)絡(luò)抖動(dòng),會(huì)讓參與者一直處于鎖定資源的狀態(tài)或者只有一部分參與者提交成功,導(dǎo)致數(shù)據(jù)的不一致。因此,在⾼并發(fā)性能⾄上的場(chǎng)景中,基于 XA 協(xié)議的分布式事務(wù)并不是最佳選擇。

 

3PC

三段提交(3PC)是二階段提交(2PC)的一種改進(jìn)版本 ,為解決兩階段提交協(xié)議的阻塞問題,上邊提到兩段提交,當(dāng)協(xié)調(diào)者崩潰時(shí),參與者不能做出最后的選擇,就會(huì)一直保持阻塞鎖定資源。

2PC 中只有協(xié)調(diào)者有超時(shí)機(jī)制,3PC 在協(xié)調(diào)者和參與者中都引入了超時(shí)機(jī)制,協(xié)調(diào)者出現(xiàn)故障后,參與者就不會(huì)一直阻塞。而且在第一階段和第二階段中又插入了一個(gè)準(zhǔn)備階段(如下圖,看著有點(diǎn)啰嗦),保證了在最后提交階段之前各參與節(jié)點(diǎn)的狀態(tài)是一致的。

 

雖然 3PC 用超時(shí)機(jī)制,解決了協(xié)調(diào)者故障后參與者的阻塞問題,但與此同時(shí)卻多了一次網(wǎng)絡(luò)通信,性能上反而變得更差,也不太推薦。

TCC

所謂的 TCC 編程模式,也是兩階段提交的一個(gè)變種,不同的是 TCC 為在業(yè)務(wù)層編寫代碼實(shí)現(xiàn)的兩階段提交。TCC 分別指 Try、Confirm、Cancel ,一個(gè)業(yè)務(wù)操作要對(duì)應(yīng)的寫這三個(gè)方法。

以下單扣庫(kù)存為例,Try 階段去占庫(kù)存,Confirm 階段則實(shí)際扣庫(kù)存,如果庫(kù)存扣減失敗 Cancel 階段進(jìn)行回滾,釋放庫(kù)存。

TCC 不存在資源阻塞的問題,因?yàn)槊總€(gè)方法都直接進(jìn)行事務(wù)的提交,一旦出現(xiàn)異常通過則 Cancel 來進(jìn)行回滾補(bǔ)償,這也就是常說的補(bǔ)償性事務(wù)。

原本一個(gè)方法,現(xiàn)在卻需要三個(gè)方法來支持,可以看到 TCC 對(duì)業(yè)務(wù)的侵入性很強(qiáng),而且這種模式并不能很好地被復(fù)用,會(huì)導(dǎo)致開發(fā)量激增。還要考慮到網(wǎng)絡(luò)波動(dòng)等原因,為保證請(qǐng)求一定送達(dá)都會(huì)有重試機(jī)制,所以考慮到接口的冪等性。

消息事務(wù)(最終一致性)

消息事務(wù)其實(shí)就是基于消息中間件的兩階段提交,將本地事務(wù)和發(fā)消息放在同一個(gè)事務(wù)里,保證本地操作和發(fā)送消息同時(shí)成功。下單扣庫(kù)存原理圖:

 

  • 訂單系統(tǒng)向 MQ 發(fā)送一條預(yù)備扣減庫(kù)存消息,MQ 保存預(yù)備消息并返回成功 ACK
  • 接收到預(yù)備消息執(zhí)行成功 ACK,訂單系統(tǒng)執(zhí)行本地下單操作,為防止消息發(fā)送成功而本地事務(wù)失敗,訂單系統(tǒng)會(huì)實(shí)現(xiàn) MQ 的回調(diào)接口,其內(nèi)不斷的檢查本地事務(wù)是否執(zhí)行成功,如果失敗則 rollback 回滾預(yù)備消息;成功則對(duì)消息進(jìn)行最終 commit 提交。
  • 庫(kù)存系統(tǒng)消費(fèi)扣減庫(kù)存消息,執(zhí)行本地事務(wù),如果扣減失敗,消息會(huì)重新投,一旦超出重試次數(shù),則本地表持久化失敗消息,并啟動(dòng)定時(shí)任務(wù)做補(bǔ)償。

基于消息中間件的兩階段提交方案,通常用在高并發(fā)場(chǎng)景下使用,犧牲數(shù)據(jù)的強(qiáng)一致性換取性能的大幅提升,不過實(shí)現(xiàn)這種方式的成本和復(fù)雜度是比較高的,還要看實(shí)際業(yè)務(wù)情況。

Seata

Seata 也是從兩段提交演變而來的一種分布式事務(wù)解決方案,提供了 AT、TCC、SAGA 和XA 等事務(wù)模式,這里重點(diǎn)介紹 AT模式。

既然 Seata 是兩段提交,那我們看看它在每個(gè)階段都做了點(diǎn)啥?下邊我們還以下單扣庫(kù)存、扣余額舉例。

 

先介紹 Seata 分布式事務(wù)的幾種角色:

  • Transaction Coordinator(TC): 全局事務(wù)協(xié)調(diào)者,用來協(xié)調(diào)全局事務(wù)和各個(gè)分支事務(wù)(不同服務(wù))的狀態(tài), 驅(qū)動(dòng)全局事務(wù)和各個(gè)分支事務(wù)的回滾或提交。
  • Transaction Manager™: 事務(wù)管理者,業(yè)務(wù)層中用來開啟/提交/回滾一個(gè)整體事務(wù)(在調(diào)用服務(wù)的方法中用注解開啟事務(wù))。
  • Resource Manager(RM): 資源管理者,一般指業(yè)務(wù)數(shù)據(jù)庫(kù)代表了一個(gè)分支事務(wù)(Branch Transaction),管理分支事務(wù)與 TC 進(jìn)行協(xié)調(diào)注冊(cè)分支事務(wù)并且匯報(bào)分支事務(wù)的狀態(tài),驅(qū)動(dòng)分支事務(wù)的提交或回滾。

Seata 實(shí)現(xiàn)分布式事務(wù),設(shè)計(jì)了一個(gè)關(guān)鍵角色 UNDO_LOG (回滾日志記錄表),我們?cè)诿總€(gè)應(yīng)用分布式事務(wù)的業(yè)務(wù)庫(kù)中創(chuàng)建這張表,這個(gè)表的核心作用就是,將業(yè)務(wù)數(shù)據(jù)在更新前后的數(shù)據(jù)鏡像組織成回滾日志,備份在 UNDO_LOG 表中,以便業(yè)務(wù)異常能隨時(shí)回滾。

第一個(gè)階段

比如:下邊我們更新 user 表的 name 字段。

  1. update user set name = '小富最帥' where name = '程序員內(nèi)點(diǎn)事' 

首先 Seata 的 JDBC 數(shù)據(jù)源代理通過對(duì)業(yè)務(wù) SQL 解析,提取 SQL 的元數(shù)據(jù),也就是得到 SQL 的類型(UPDATE),表(user),條件(where name = '程序員內(nèi)點(diǎn)事')等相關(guān)的信息。

第一個(gè)階段的流程圖

 

先查詢數(shù)據(jù)前鏡像,根據(jù)解析得到的條件信息,生成查詢語句,定位一條數(shù)據(jù)。

  1. select  name from user where name = '程序員內(nèi)點(diǎn)事' 

數(shù)據(jù)前鏡像

 

緊接著執(zhí)行業(yè)務(wù) SQL,根據(jù)前鏡像數(shù)據(jù)主鍵查詢出后鏡像數(shù)據(jù)

  1. select name from user where id = 1 

 


 

數(shù)據(jù)后鏡像

 

把業(yè)務(wù)數(shù)據(jù)在更新前后的數(shù)據(jù)鏡像組織成回滾日志,將業(yè)務(wù)數(shù)據(jù)的更新和回滾日志在同一個(gè)本地事務(wù)中提交,分別插入到業(yè)務(wù)表和 UNDO_LOG 表中。

回滾記錄數(shù)據(jù)格式如下:包括 afterImage 前鏡像、beforeImage 后鏡像、 branchId 分支事務(wù)ID、xid 全局事務(wù)ID

  1.     "branchId":641789253, 
  2.     "xid":"xid:xxx"
  3.     "undoItems":[ 
  4.         { 
  5.             "afterImage":{ 
  6.                 "rows":[ 
  7.                     { 
  8.                         "fields":[ 
  9.                             { 
  10.                                 "name":"id"
  11.                                 "type":4, 
  12.                                 "value":1 
  13.                             } 
  14.                         ] 
  15.                     } 
  16.                 ], 
  17.                 "tableName":"product" 
  18.             }, 
  19.             "beforeImage":{ 
  20.                 "rows":[ 
  21.                     { 
  22.                         "fields":[ 
  23.                             { 
  24.                                 "name":"id"
  25.                                 "type":4, 
  26.                                 "value":1 
  27.                             } 
  28.                         ] 
  29.                     } 
  30.                 ], 
  31.                 "tableName":"product" 
  32.             }, 
  33.             "sqlType":"UPDATE" 
  34.         } 
  35.     ] 

這樣就可以保證,任何提交的業(yè)務(wù)數(shù)據(jù)的更新一定有相應(yīng)的回滾日志。

在本地事務(wù)提交前,各分支事務(wù)需向 全局事務(wù)協(xié)調(diào)者 TC 注冊(cè)分支 ( Branch Id) ,為要修改的記錄申請(qǐng) 全局鎖 ,要為這條數(shù)據(jù)加鎖,利用 SELECT FOR UPDATE 語句。而如果一直拿不到鎖那就需要回滾本地事務(wù)。TM 開啟事務(wù)后會(huì)生成全局唯一的 XID,會(huì)在各個(gè)調(diào)用的服務(wù)間進(jìn)行傳遞。

有了這樣的機(jī)制,本地事務(wù)分支(Branch Transaction)便可以在全局事務(wù)的第一階段提交,并馬上釋放本地事務(wù)鎖定的資源。相比于傳統(tǒng)的 XA 事務(wù)在第二階段釋放資源,Seata降低了鎖范圍提高效率,即使第二階段發(fā)生異常需要回滾,也可以快速 從UNDO_LOG 表中找到對(duì)應(yīng)回滾數(shù)據(jù)并反解析成 SQL 來達(dá)到回滾補(bǔ)償。

最后本地事務(wù)提交,業(yè)務(wù)數(shù)據(jù)的更新和前面生成的 UNDO LOG 數(shù)據(jù)一并提交,并將本地事務(wù)提交的結(jié)果上報(bào)給全局事務(wù)協(xié)調(diào)者 TC。

第二個(gè)階段

第二階段是根據(jù)各分支的決議做提交或回滾:

如果決議是全局提交,此時(shí)各分支事務(wù)已提交并成功,這時(shí) 全局事務(wù)協(xié)調(diào)者(TC) 會(huì)向分支發(fā)送第二階段的請(qǐng)求。收到 TC 的分支提交請(qǐng)求,該請(qǐng)求會(huì)被放入一個(gè)異步任務(wù)隊(duì)列中,并馬上返回提交成功結(jié)果給 TC。異步隊(duì)列中會(huì)異步和批量地根據(jù) Branch ID 查找并刪除相應(yīng) UNDO LOG 回滾記錄。

 

如果決議是全局回滾,過程比全局提交麻煩一點(diǎn),RM 服務(wù)方收到 TC 全局協(xié)調(diào)者發(fā)來的回滾請(qǐng)求,通過 XID 和 Branch ID 找到相應(yīng)的回滾日志記錄,通過回滾記錄生成反向的更新 SQL 并執(zhí)行,以完成分支的回滾。

注意:這里刪除回滾日志記錄操作,一定是在本地業(yè)務(wù)事務(wù)執(zhí)行之后

 

上邊說了幾種分布式事務(wù)各自的優(yōu)缺點(diǎn),下邊實(shí)踐一下分布式事務(wù)中間 Seata 感受一下。

Seata 實(shí)踐

Seata 是一個(gè)需獨(dú)立部署的中間件,所以先搭 Seata Server,這里以最新的 seata-server-1.4.0 版本為例,下載地址:https://seata.io/en-us/blog/download.html

解壓后的文件我們只需要關(guān)心 \seata\conf 目錄下的 file.conf 和 registry.conf 文件。

Seata Server

file.conf

file.conf 文件用于配置持久化事務(wù)日志的模式,目前提供 file、db、redis 三種方式。


 

file.conf 文件配置

 

注意:在選擇 db 方式后,需要在對(duì)應(yīng)數(shù)據(jù)庫(kù)創(chuàng)建 globalTable(持久化全局事務(wù))、branchTable(持久化各提交分支的事務(wù))、 lockTable(持久化各分支鎖定資源事務(wù))三張表。

  1. -- the table to store GlobalSession data 
  2. -- 持久化全局事務(wù) 
  3. CREATE TABLE IF NOT EXISTS `global_table` 
  4.     `xid`                       VARCHAR(128) NOT NULL
  5.     `transaction_id`            BIGINT
  6.     `status`                    TINYINT      NOT NULL
  7.     `application_id`            VARCHAR(32), 
  8.     `transaction_service_group` VARCHAR(32), 
  9.     `transaction_name`          VARCHAR(128), 
  10.     `timeout`                   INT
  11.     `begin_time`                BIGINT
  12.     `application_data`          VARCHAR(2000), 
  13.     `gmt_create`                DATETIME, 
  14.     `gmt_modified`              DATETIME, 
  15.     PRIMARY KEY (`xid`), 
  16.     KEY `idx_gmt_modified_status` (`gmt_modified`, `status`), 
  17.     KEY `idx_transaction_id` (`transaction_id`) 
  18. ) ENGINE = InnoDB 
  19.   DEFAULT CHARSET = utf8; 
  20.  
  21. -- the table to store BranchSession data 
  22. -- 持久化各提交分支的事務(wù) 
  23. CREATE TABLE IF NOT EXISTS `branch_table` 
  24.     `branch_id`         BIGINT       NOT NULL
  25.     `xid`               VARCHAR(128) NOT NULL
  26.     `transaction_id`    BIGINT
  27.     `resource_group_id` VARCHAR(32), 
  28.     `resource_id`       VARCHAR(256), 
  29.     `branch_type`       VARCHAR(8), 
  30.     `status`            TINYINT, 
  31.     `client_id`         VARCHAR(64), 
  32.     `application_data`  VARCHAR(2000), 
  33.     `gmt_create`        DATETIME(6), 
  34.     `gmt_modified`      DATETIME(6), 
  35.     PRIMARY KEY (`branch_id`), 
  36.     KEY `idx_xid` (`xid`) 
  37. ) ENGINE = InnoDB 
  38.   DEFAULT CHARSET = utf8; 
  39.  
  40. -- the table to store lock data 
  41. -- 持久化每個(gè)分支鎖表事務(wù) 
  42. CREATE TABLE IF NOT EXISTS `lock_table` 
  43.     `row_key`        VARCHAR(128) NOT NULL
  44.     `xid`            VARCHAR(96), 
  45.     `transaction_id` BIGINT
  46.     `branch_id`      BIGINT       NOT NULL
  47.     `resource_id`    VARCHAR(256), 
  48.     `table_name`     VARCHAR(32), 
  49.     `pk`             VARCHAR(36), 
  50.     `gmt_create`     DATETIME, 
  51.     `gmt_modified`   DATETIME, 
  52.     PRIMARY KEY (`row_key`), 
  53.     KEY `idx_branch_id` (`branch_id`) 
  54. ) ENGINE = InnoDB 
  55.   DEFAULT CHARSET = utf8; 

registry.conf

registry.conf 文件設(shè)置 注冊(cè)中心 和 配置中心:

目前注冊(cè)中心支持 nacos 、eureka、redis、zk、consul、etcd3、sofa 七種,這里我使用的 eureka作為注冊(cè)中心 ;配置中心支持 nacos 、apollo、zk、consul、etcd3五種方式。

registry.conf 文件配置

 

配置完以后在 \seata\bin 目錄下啟動(dòng) seata-server 即可,到這 Seata 的服務(wù)端就搭建好了。

Seata Client

Seata Server 環(huán)境搭建完,接下來我們新建三個(gè)服務(wù) order-server(下單服務(wù))、storage-server(扣減庫(kù)存服務(wù))、account-server(賬戶金額服務(wù)),分別服務(wù)注冊(cè)到eureka。

每個(gè)服務(wù)的大體核心配置如下:

  1. spring: 
  2.     application: 
  3.         name: storage-server 
  4.     cloud: 
  5.         alibaba: 
  6.             seata: 
  7.                 tx-service-group: my_test_tx_group 
  8.     datasource: 
  9.         driver-class-name: com.mysql.jdbc.Driver 
  10.         url: jdbc:mysql://47.93.6.1:3306/seat-storage 
  11.         username: root 
  12.         password: root 
  13.  
  14. # eureka 注冊(cè)中心 
  15. eureka: 
  16.     client: 
  17.         serviceUrl: 
  18.             defaultZone: http://${eureka.instance.hostname}:8761/eureka/ 
  19.     instance: 
  20.         hostname: 47.93.6.5 
  21.         prefer-ip-address: true 

業(yè)務(wù)大致流程:用戶發(fā)起下單請(qǐng)求,本地 order 訂單服務(wù)創(chuàng)建訂單記錄,并通過 RPC 遠(yuǎn)程調(diào)用 storage 扣減庫(kù)存服務(wù)和 account 扣賬戶余額服務(wù),只有三個(gè)服務(wù)同時(shí)執(zhí)行成功,才是一個(gè)完整的下單流程。如果某個(gè)服執(zhí)行失敗,則其他服務(wù)全部回滾。

Seata 對(duì)業(yè)務(wù)代碼的侵入性非常小,代碼中使用只需用 @GlobalTransactional 注解開啟一個(gè)全局事務(wù)即可。

  1. @Override 
  2. @GlobalTransactional(name = "create-order", rollbackFor = Exception.class) 
  3. public void create(Order order) { 
  4.  
  5.     String xid = RootContext.getXID(); 
  6.  
  7.     LOGGER.info("------->交易開始"); 
  8.     //本地方法 
  9.     orderDao.create(order); 
  10.  
  11.     //遠(yuǎn)程方法 扣減庫(kù)存 
  12.     storageApi.decrease(order.getProductId(), order.getCount()); 
  13.  
  14.     //遠(yuǎn)程方法 扣減賬戶余額 
  15.     LOGGER.info("------->扣減賬戶開始o(jì)rder中"); 
  16.     accountApi.decrease(order.getUserId(), order.getMoney()); 
  17.     LOGGER.info("------->扣減賬戶結(jié)束order中"); 
  18.  
  19.     LOGGER.info("------->交易結(jié)束"); 
  20.     LOGGER.info("全局事務(wù) xid: {}", xid); 

前邊說過 Seata AT 模式實(shí)現(xiàn)分布式事務(wù),必須在相關(guān)的業(yè)務(wù)庫(kù)中創(chuàng)建 undo_log 表來存數(shù)據(jù)回滾日志,表結(jié)構(gòu)如下:

  1. -- for AT mode you must to init this sql for you business database. the seata server not need it. 
  2. CREATE TABLE IF NOT EXISTS `undo_log` 
  3.     `id`            BIGINT(20)   NOT NULL AUTO_INCREMENT COMMENT 'increment id'
  4.     `branch_id`     BIGINT(20)   NOT NULL COMMENT 'branch transaction id'
  5.     `xid`           VARCHAR(100) NOT NULL COMMENT 'global transaction id'
  6.     `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization'
  7.     `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info'
  8.     `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status'
  9.     `log_created`   DATETIME     NOT NULL COMMENT 'create datetime'
  10.     `log_modified`  DATETIME     NOT NULL COMMENT 'modify datetime'
  11.     PRIMARY KEY (`id`), 
  12.     UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`) 
  13. ) ENGINE = InnoDB 
  14.   AUTO_INCREMENT = 1 
  15.   DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table'

到這環(huán)境搭建的工作就完事了,完整案例會(huì)在后邊貼出 GitHub 地址,就不在這占用篇幅了。

測(cè)試 Seata

項(xiàng)目中的服務(wù)調(diào)用過程如下圖:

服務(wù)調(diào)用過程

 

啟動(dòng)各個(gè)服務(wù)后,我們直接請(qǐng)求下單接口看看效果,只要 order 訂單表創(chuàng)建記錄成功,storage 庫(kù)存表 used 字段數(shù)量遞增、account 余額表 used 字段數(shù)量遞增則表示下單流程成功。

原始數(shù)據(jù)

 

請(qǐng)求后正向流程是沒問題的,數(shù)據(jù)和預(yù)想的一樣

下單數(shù)據(jù)

 

而且發(fā)現(xiàn) TM 事務(wù)管理者 order-server 服務(wù)的控制臺(tái)也打印出了兩階段提交的日志

控制臺(tái)兩次提交

 

那么再看看如果其中一個(gè)服務(wù)異常,會(huì)不會(huì)正常回滾呢?在 account-server 服務(wù)中模擬超時(shí)異常,看能否實(shí)現(xiàn)全局事務(wù)回滾。

全局事務(wù)回滾

 

發(fā)現(xiàn)數(shù)據(jù)全沒執(zhí)行成功,說明全局事務(wù)回滾也成功了

 

那看一下 undo_log 回滾記錄表的變化情況,由于 Seata 刪除回滾日志的速度很快,所以要想在表中看見回滾日志,必須要在某一個(gè)服務(wù)上打斷點(diǎn)才看的更明顯。

回滾記錄

 

總結(jié)

上邊簡(jiǎn)單介紹了 2PC、3PC、TCC、MQ、Seata 這五種分布式事務(wù)解決方案,還詳細(xì)的實(shí)踐了 Seata 中間件。但不管我們選哪一種方案,在項(xiàng)目中應(yīng)用都要謹(jǐn)慎再謹(jǐn)慎,除特定的數(shù)據(jù)強(qiáng)一致性場(chǎng)景外,能不用盡量就不要用,因?yàn)闊o論它們性能如何優(yōu)越,一旦項(xiàng)目套上分布式事務(wù),整體效率會(huì)幾倍的下降,在高并發(fā)情況下弊端尤為明顯。

 

本案例 github 地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-seata-transaction

 

責(zé)任編輯:武曉燕 來源: 程序員內(nèi)點(diǎn)事
相關(guān)推薦

2022-06-21 08:27:22

Seata分布式事務(wù)

2022-07-10 20:24:48

Seata分布式事務(wù)

2019-07-25 15:32:35

分布式事務(wù)微服務(wù)系統(tǒng)架構(gòu)

2023-11-06 13:15:32

分布式事務(wù)Seata

2023-01-06 09:19:12

Seata分布式事務(wù)

2025-04-28 00:44:04

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)

2022-01-12 10:02:02

TCC模式 Seata

2024-08-19 09:05:00

Seata分布式事務(wù)

2025-05-07 00:10:00

分布式事務(wù)TCC模式

2022-03-24 07:51:27

seata分布式事務(wù)Java

2025-08-05 08:30:08

2023-09-14 15:44:46

分布式事務(wù)數(shù)據(jù)存儲(chǔ)

2025-08-27 09:11:48

2021-08-06 08:33:27

Springboot分布式Seata

2025-04-30 10:44:02

2024-10-09 14:14:07

2021-04-23 08:15:51

Seata XA AT

2023-08-17 10:23:07

擴(kuò)展方案

2024-03-26 12:08:53

分布式事務(wù)存儲(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产乱淫av片| 一区二区不卡在线视频 午夜欧美不卡' | 日本蜜桃在线观看视频| 久久中文娱乐网| 国产日韩欧美在线播放| 久久久久久久久久综合| 亚洲福利天堂| 91精品欧美久久久久久动漫| 欧美黑人经典片免费观看| 精品99又大又爽又硬少妇毛片| 麻豆国产精品一区二区三区| 欧美激情三级免费| 国产精品综合激情| 日韩伦理一区二区三区| 欧美一区二区三区免费视频| 久草资源站在线观看| 精品视频在线一区二区| 久久综合色8888| 99在线视频首页| 中国女人一级一次看片| 亚洲三级毛片| 欧美肥老妇视频| 美女网站视频色| 一区二区三区四区在线看| 欧美一区2区视频在线观看| 精品久久久噜噜噜噜久久图片| 伊人在我在线看导航| 国产亚洲精品aa| 国产一区二区三区免费不卡| 国产精品无码天天爽视频| 久久精品一本| 91精品国产色综合久久不卡98| 欧美黑人性猛交xxx| 欧美欧美黄在线二区| 精品成人私密视频| 性xxxxxxxxx| 久久精品九色| 7777精品伊人久久久大香线蕉完整版| aa免费在线观看| 蜜桃视频www网站在线观看| 亚洲精品成人精品456| 在线精品日韩| 日本在线视频网| 中文字幕欧美区| 日韩高清dvd| 黄色小视频在线观看| 91亚洲精品一区二区乱码| 官网99热精品| 亚洲第一视频在线播放| 国产一区二区三区在线看麻豆| 国产精品久久久久久久久影视 | 亚洲福利久久| 欧美精品成人在线| 精品无码久久久久久久久| 欧美日韩视频| 欧美高清自拍一区| 久草国产在线视频| 国内精品久久久久久久影视麻豆| 欧美激情在线视频二区| 久久精品无码人妻| 亚洲经典三级| 欧美中文字幕在线播放| 在线能看的av| 免费视频一区| 国产98色在线| 中文字字幕在线观看| 精品一区二区在线看| 成人在线中文字幕| www.四虎在线观看| 成人免费av在线| 久久av免费一区| 黄色av网站在线免费观看| 国产欧美日韩另类视频免费观看 | 国产高清在线观看| 国产精品蜜臀在线观看| 国产奶头好大揉着好爽视频| 91蜜桃在线视频| 亚洲成人福利片| 成人免费观看视频在线观看| 素人啪啪色综合| 日韩一区二区中文字幕| 国产精品一区二区人妻喷水| 首页亚洲中字| 中文字幕日韩精品有码视频| 日本精品在线免费观看| 在线看片欧美| 国产精品久久久久久久app| 国产精品亚洲欧美在线播放| 成人激情综合网站| 日韩欧美电影一区二区| 国产在线69| 欧美日韩一区二区三区| www.污网站| 婷婷激情久久| 久久中国妇女中文字幕| 久久精品无码av| 国产麻豆精品视频| 欧美三级华人主播| 色黄网站在线观看| 91成人在线观看喷潮| 手机在线视频一区| 要久久电视剧全集免费| 久久最新资源网| 最近免费中文字幕大全免费版视频| 精彩视频一区二区三区| 精品国产乱码久久久久软件| 欧美13一16娇小xxxx| 欧美日韩国产色| 国产精品熟女一区二区不卡| 精品在线观看入口| 久久久久久com| 亚洲熟妇av乱码在线观看| av一区二区久久| 可以免费看的黄色网址| 粉嫩av一区二区三区四区五区| 亚洲精品97久久| 老女人性淫交视频| 美女视频黄频大全不卡视频在线播放| 国产99视频精品免费视频36| 午夜国产福利在线| 精品电影在线观看| 伦伦影院午夜理论片| 国产一区二区三区探花| 久久久久久亚洲| 亚洲无码精品在线播放| 91免费看`日韩一区二区| 中文字幕精品在线播放 | 国产精品视频成人| 神马午夜一区二区| 国产精品国产自产拍高清av王其| 久久婷婷五月综合色国产香蕉| 日韩欧洲国产| 日韩有码片在线观看| 制服.丝袜.亚洲.中文.综合懂色| 国产在线一区二区| 色姑娘综合网| h片精品在线观看| 欧美日韩亚洲丝袜制服| 中文字幕一区二区三区人妻不卡| 欧美一区成人| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 伊人久久久久久久久久| 日本亚洲欧美在线| 成人av资源站| 激情六月天婷婷| 农村妇女一区二区| 亚洲午夜av久久乱码| 日本午夜视频在线观看| 成人性生交大片免费看中文 | 97超碰资源站| 国产精品久久久久久久浪潮网站 | 日韩欧美的一区二区| 三上悠亚作品在线观看| 免费观看久久久4p| 日韩精品欧美专区| 国产精品99精品一区二区三区∴| 亚洲男女性事视频| 青草视频在线观看免费| a在线播放不卡| 成年人网站国产| 亚洲乱码一区| 久久露脸国产精品| 少妇无码一区二区三区| 精品国产91久久久久久| 久久福利小视频| 国产一区二区三区的电影| 国产亚洲欧美一区二区三区| 午夜伦理大片视频在线观看| 精品国产一区二区三区av性色| 久久久久久久久久91| 国产成+人+日韩+欧美+亚洲| 正在播放国产精品| 电影一区二区| 色视频www在线播放国产成人 | 日韩精品一二区| 日韩久久不卡| 成人在线视频国产| 欧美韩日一区二区| 天天摸夜夜添狠狠添婷婷| 图片区小说区区亚洲影院| 91久久免费视频| 日本成人在线视频网站| 这里只有精品66| 亚洲精品国产九九九| 97超级碰碰人国产在线观看| 日韩一区二区三区不卡| 欧美亚洲一区二区三区四区| 黄色香蕉视频在线观看| 大桥未久av一区二区三区中文| 日韩伦理在线免费观看| 麻豆精品少妇| 国产精品免费久久久| 最近中文字幕免费mv2018在线 | 成人午夜视频一区二区播放| 黑丝美女久久久| 人人妻人人澡人人爽| 精品在线免费视频| 丰满的少妇愉情hd高清果冻传媒 | 日韩av在线精品| 日韩国产成人在线| 亚洲免费观看高清完整版在线 | 国产免费毛卡片| 凹凸成人精品亚洲精品密奴| 92裸体在线视频网站| 国产传媒在线观看| 中文字幕亚洲专区| 粉嫩小泬无遮挡久久久久久| 欧美午夜电影在线播放| 欧美日韩在线视频免费播放| 久久综合久久综合久久| 色男人天堂av| 久久这里只有| 欧美性视频在线播放| 亚洲综合图色| 91久久久久久久久久久久久| 理论不卡电影大全神| 日韩中文理论片| 无码国产精品高潮久久99| 制服丝袜一区二区三区| av图片在线观看| 一区二区三区在线观看欧美| 亚洲天堂久久新| 福利电影一区二区三区| 九热视频在线观看| 欧美网站在线| 国产又大又长又粗又黄| 九九亚洲视频| 国产激情美女久久久久久吹潮| jizzjizz少妇亚洲水多| 欧美激情欧美狂野欧美精品| 成人免费观看视频大全| 在线观看欧美视频| 三级理论午夜在线观看| 欧美大片日本大片免费观看| 做爰无遮挡三级| 香蕉乱码成人久久天堂爱免费| 久久久久久久久久综合| 亚洲欧美日韩在线| 国产在视频线精品视频| 久久久亚洲高清| 久久久久亚洲AV成人网人人小说| 国产成人免费av在线| 国产欧美激情视频| 日本麻豆一区二区三区视频| 红桃av在线播放| 最新日韩在线| 人人妻人人添人人爽欧美一区| 欧美日韩少妇| 4444在线观看| 国产一区三区在线播放| 欧美午夜精品久久久久久蜜| 色天下一区二区三区| 精品国产一区二区三| 第四色中文综合网| 亚洲一区中文字幕| 精品国产不卡一区二区| 国产在线a不卡| 国产激情精品一区二区三区| 国产欧亚日韩视频| 亚洲国产伊人| 91久久在线播放| 国产一区二区视频在线看| 国产日韩中文字幕在线| 99久久久国产| av一区二区三区免费| 天堂精品在线视频| av在线不卡一区| 欧美一级全黄| 日本10禁啪啪无遮挡免费一区二区| 成人高清电影网站| 亚洲欧美久久234| 国产精品久久久久无码av| 免费观看中文字幕| 欧美特黄一级| 久久国产色av免费观看| 视频一区在线播放| 污视频免费在线观看网站| 麻豆精品视频在线观看免费| 亚洲美女性囗交| 成人国产精品免费观看视频| 色噜噜在线观看| 中文字幕不卡一区| 国产女人18水真多毛片18精品| 亚洲国产精品精华液网站| 在线免费黄色av| 欧美亚日韩国产aⅴ精品中极品| 日本妇乱大交xxxxx| 欧美精品一级二级| 少妇人妻偷人精品一区二区| 亚洲欧美一区二区三区四区| 77777影视视频在线观看| 久久久国产一区二区三区| 黄色成人在线网| 国产免费一区二区三区在线能观看 | 精品无码久久久久国产| jizzjizz欧美69巨大| 日本女人高潮视频| 中国女人久久久| 亚洲一级片网站| 国产成人午夜99999| jizz中文字幕| 亚洲综合一区二区三区| 久久青青草原亚洲av无码麻豆| 欧美精品高清视频| 亚洲AV无码一区二区三区性| 一区二区三区天堂av| 少女频道在线观看高清| 国产精品91视频| a级日韩大片| 伊人久久婷婷色综合98网| 99亚洲精品| 国产在线观看中文字幕| 久久免费视频色| 国产suv精品一区二区68| 在线免费观看日本欧美| 亚洲成人第一区| 日韩亚洲国产中文字幕| 不卡福利视频| 国产欧美日韩伦理| 围产精品久久久久久久| 久在线观看视频| 国产一区二区三区高清播放| www.中文字幕av| 天天av天天翘天天综合网色鬼国产| 一级黄色片在线播放| 亚洲欧美综合v| 国内外激情在线| 国产精品第二页| 成人偷拍自拍| 9191国产视频| 久久99国产乱子伦精品免费| 国产精品扒开腿做爽爽| 亚洲第一搞黄网站| 亚洲第一天堂在线观看| 久久精品国产清自在天天线| 国产 日韩 欧美一区| 精品国产一区二区三区日日嗨| 99久久.com| 日本人视频jizz页码69| 久久久久久免费网| 自拍偷拍欧美亚洲| 日韩精品中文字幕久久臀| 日本欧美电影在线观看| 91精品免费视频| 99久久99久久精品国产片果冰| 色婷婷.com| 中文字幕+乱码+中文字幕一区| 亚洲精品男人的天堂| 亚洲激情视频在线| 尤物视频在线看| 国产女主播一区二区三区| 韩国在线视频一区| japan高清日本乱xxxxx| 亚洲天堂a在线| 成人h动漫精品一区二区无码| 久久久极品av| 成人在线啊v| 欧美另类videosbestsex日本| 国产.欧美.日韩| 国产在线一二区| 亚洲成人黄色在线观看| segui88久久综合9999| 欧美精品一区二区三区久久| 久久久久久穴| 国产主播av在线| 欧美久久久久中文字幕| 八戒八戒神马在线电影| 18成人在线| 亚洲第一毛片| 第四色在线视频| 欧美在线啊v一区| 欧美日本高清| 91在线看网站| 亚洲欧美日韩国产一区二区| av中文字幕免费观看| 欧美少妇bbb| 成人毛片av在线| 欧美极品一区| 精一区二区三区| 看片网站在线观看| 日韩三级高清在线| 亚洲淫成人影院| 亚洲欧洲一区二区| 国产精品伊人色| 久久人妻免费视频| 日韩亚洲国产中文字幕| 亚洲伊人影院| 久久久久久久久久久福利| 亚洲欧美综合网| 狠狠人妻久久久久久综合麻豆| 欧美一区二区影院| 亚洲国产精品成人| 动漫美女无遮挡免费| 日本久久电影网| 制服丝袜中文字幕在线| 日本一区美女| 国产福利精品导航| 欧美性猛交bbbbb精品| 日韩中文字幕免费看| 一区二区视频|