java防止undo空间撑爆_秒杀系统设计补坑篇(seata回顾)
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)題。
- 上一篇: java主要内存区域_可能是把Java内
- 下一篇: 基于matlab的语音信号基本处理系统,