java防止undo空间撑爆_秒杀系统设计补坑篇(seata回顾)
seata是什么
Seata 是一款開源的分布式事務解決方案,致力于在微服務架構下提供高性能和簡單易用的分布式事務服務。 它提供了AT(常用)、saga(長事務解決方案)等多種事務模式。
seata術語
Seata分為三個模塊,分別是TM、RM和TC(簡寫)。
TC(transaction Coordinator),代表seata服務器,seata是一個spring boot的jar包。
TM(transaction Manager)事務管理器。
RM(Resource Manager) 代表每個數據庫。
Seata還用了一個XID,代表了一個分布式事務,相當于dubbo中的Request ID。
seata流程
TM向TC注冊全局事務,并生成全局唯一的XID。
RM向TC注冊分支事務,并將其納入該XID對應的全局事務范圍。
RM向TC匯報資源的準備狀態。
TC匯總所有事務參與者的執行狀態,決定分布式事務是全部提交還是全部回滾。
TC通知所有RM提交/回滾事務。
seata流程相親版
盧學霸(TM)跟導師(TC)提議,為盧學霸安排對象,盧學霸生成了一個相親id。
女神(RM)向tc注冊了資料,盧學霸在他的相親id中接收到了推送。
女神向盧學霸匯報自己的資料。
TC匯總所有女神的資料,讓盧學霸決定是否去參加相親。
TC向盧學霸匯報相親結果。
seata例子
seata工作流程
Seata使用了增強型二階段提交實現。
假如你有一個數據庫,里面有一張訂單表,要實現分布式事務。
那么要滿足2個條件,訂單表必須要有id主鍵字段,主鍵是為了給Seata加本地鎖。
第二個條件,你的數據庫中,要建一張undo_log表,記錄回滾日志。 建表語句如下:
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;
一階段:業務數據和回滾記錄在同一個本地事務中提交,釋放本地鎖和連接資源。
二階段:異步提交,回滾通過一階段的回滾日志進行反向補償。
一階段
從上文中,我們得知seata使用了一個增強型2階段提交,我們現在開始分析一階段:
前文中,我們提到要給訂單表實現分布式事務。
在訂單微服務引入了seata之后,seata會攔截每條訂單表的sql, 例如update語句,為訂單表生成before image。
執行業務sql更新之后,其保存為after image,并生成行鎖。
以上操作全部在訂單數據庫內的一個事務完成,保證了一階段操作的原子性。
二階段之提交
因為業務sql在一階段已經提交至數據庫,所以seata框架只需要將一階段的快照和行鎖刪除即可。
二階段之回滾
前面提到了XID全局事務id,seata要根據XID和branch id找到相應的undo log日志。
數據校驗:拿undo_log中的after image鏡像數據與當前業務表中的數據進行比較, 如果不同,說明數據被當前事務之外的動作做了修改,那么事務不會回滾。
如果比較通過,則根據undo_log中的before image鏡像數據和業務sql的相關信息 生成回滾語句并執行。
seata工作流程之戀愛篇
盧學霸和女神談戀愛了。
盧學霸預料到自己可能和女神吵架,所以將目前好的狀態備份為before image。
盧學霸某天和女神吵架了。
盧學霸找到前幾天備份的鏡像,看看當前狀態和after image是否一致,如果一致,說明不會發生蝴蝶效應。
盧學霸回到過去改變世界。
總結
以上是生活随笔為你收集整理的java防止undo空间撑爆_秒杀系统设计补坑篇(seata回顾)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java主要内存区域_可能是把Java内
- 下一篇: Spring boot 配置tomcat