日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

java防止undo空间撑爆_秒杀系统设计补坑篇(seata回顾)

發(fā)布時(shí)間:2023/12/19 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java防止undo空间撑爆_秒杀系统设计补坑篇(seata回顾) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

seata是什么

Seata 是一款開(kāi)源的分布式事務(wù)解決方案,致力于在微服務(wù)架構(gòu)下提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。 它提供了AT(常用)、saga(長(zhǎng)事務(wù)解決方案)等多種事務(wù)模式。

seata術(shù)語(yǔ)

Seata分為三個(gè)模塊,分別是TM、RM和TC(簡(jiǎn)寫(xiě))。

TC(transaction Coordinator),代表seata服務(wù)器,seata是一個(gè)spring boot的jar包。

TM(transaction Manager)事務(wù)管理器。

RM(Resource Manager) 代表每個(gè)數(shù)據(jù)庫(kù)。

Seata還用了一個(gè)XID,代表了一個(gè)分布式事務(wù),相當(dāng)于dubbo中的Request ID。

seata流程

TM向TC注冊(cè)全局事務(wù),并生成全局唯一的XID。

RM向TC注冊(cè)分支事務(wù),并將其納入該XID對(duì)應(yīng)的全局事務(wù)范圍。

RM向TC匯報(bào)資源的準(zhǔn)備狀態(tài)。

TC匯總所有事務(wù)參與者的執(zhí)行狀態(tài),決定分布式事務(wù)是全部提交還是全部回滾。

TC通知所有RM提交/回滾事務(wù)。

seata流程相親版

盧學(xué)霸(TM)跟導(dǎo)師(TC)提議,為盧學(xué)霸安排對(duì)象,盧學(xué)霸生成了一個(gè)相親id。

女神(RM)向tc注冊(cè)了資料,盧學(xué)霸在他的相親id中接收到了推送。

女神向盧學(xué)霸匯報(bào)自己的資料。

TC匯總所有女神的資料,讓盧學(xué)霸決定是否去參加相親。

TC向盧學(xué)霸匯報(bào)相親結(jié)果。

seata例子

seata工作流程

Seata使用了增強(qiáng)型二階段提交實(shí)現(xiàn)。

假如你有一個(gè)數(shù)據(jù)庫(kù),里面有一張訂單表,要實(shí)現(xiàn)分布式事務(wù)。

那么要滿足2個(gè)條件,訂單表必須要有id主鍵字段,主鍵是為了給Seata加本地鎖。

第二個(gè)條件,你的數(shù)據(jù)庫(kù)中,要建一張undo_log表,記錄回滾日志。 建表語(yǔ)句如下:

CREATE TABLE `undo_log` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`branch_id` bigint(20) NOT NULL,

`xid` varchar(100) NOT NULL,

`context` varchar(128) NOT NULL,

`rollback_info` longblob NOT NULL,

`log_status` int(11) NOT NULL,

`log_created` datetime NOT NULL,

`log_modified` datetime NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

一階段:業(yè)務(wù)數(shù)據(jù)和回滾記錄在同一個(gè)本地事務(wù)中提交,釋放本地鎖和連接資源。

二階段:異步提交,回滾通過(guò)一階段的回滾日志進(jìn)行反向補(bǔ)償。

一階段

從上文中,我們得知seata使用了一個(gè)增強(qiáng)型2階段提交,我們現(xiàn)在開(kāi)始分析一階段:

前文中,我們提到要給訂單表實(shí)現(xiàn)分布式事務(wù)。

在訂單微服務(wù)引入了seata之后,seata會(huì)攔截每條訂單表的sql, 例如update語(yǔ)句,為訂單表生成before image。

執(zhí)行業(yè)務(wù)sql更新之后,其保存為after image,并生成行鎖。

以上操作全部在訂單數(shù)據(jù)庫(kù)內(nèi)的一個(gè)事務(wù)完成,保證了一階段操作的原子性。

二階段之提交

因?yàn)闃I(yè)務(wù)sql在一階段已經(jīng)提交至數(shù)據(jù)庫(kù),所以seata框架只需要將一階段的快照和行鎖刪除即可。

二階段之回滾

前面提到了XID全局事務(wù)id,seata要根據(jù)XID和branch id找到相應(yīng)的undo log日志。

數(shù)據(jù)校驗(yàn):拿undo_log中的after image鏡像數(shù)據(jù)與當(dāng)前業(yè)務(wù)表中的數(shù)據(jù)進(jìn)行比較, 如果不同,說(shuō)明數(shù)據(jù)被當(dāng)前事務(wù)之外的動(dòng)作做了修改,那么事務(wù)不會(huì)回滾。

如果比較通過(guò),則根據(jù)undo_log中的before image鏡像數(shù)據(jù)和業(yè)務(wù)sql的相關(guān)信息 生成回滾語(yǔ)句并執(zhí)行。

seata工作流程之戀愛(ài)篇

盧學(xué)霸和女神談戀愛(ài)了。

盧學(xué)霸預(yù)料到自己可能和女神吵架,所以將目前好的狀態(tài)備份為before image。

盧學(xué)霸某天和女神吵架了。

盧學(xué)霸找到前幾天備份的鏡像,看看當(dāng)前狀態(tài)和after image是否一致,如果一致,說(shuō)明不會(huì)發(fā)生蝴蝶效應(yīng)。

盧學(xué)霸回到過(guò)去改變世界。

總結(jié)

以上是生活随笔為你收集整理的java防止undo空间撑爆_秒杀系统设计补坑篇(seata回顾)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。