seata(https://github.com/seata/seata)是一個分布式事務解決方案,內置了對AT、XA、TCC、saga的支持,主要由TC TM RM三類角色,TC(事務協調器)作為服務端,TM(事務管理器)和RM(資源管理器)工作在客戶端。 seata最大程度的保證了對應用的透明。
AT模式:AT模式是通過一個兩階段提交的方式來管理事務,
第一階段:通過對數據庫連接的代理,對分布式事務下的SQL語句進行了解析。 在SQL執行前后,生成了將要操作數據行的數據鏡像(undolog),並和SQL操作一起作為一個事物插入到數據庫中。
第二階段:在分布式操作完成后,由TM完成事物的提交或者回滾(本質上發送提交或者回滾命令給TC服務端), 再又TC服務端通知各個分支事務進行提交或者回滾。 如果是提交操作,因為在第一階段已經完成了數據庫的事物,所以只需要刪除對應的undolog即可,如果是回滾操作,則需要根據undolog,生成對應的反向語句,更新數據庫。
在第一階段末尾,有個很重要的操作是申請全局鎖,如果申請失敗,第一階段的事務是不會提交的,這個全局鎖,其實就是由准備更新的表的行主鍵Id組成。 如果這個時候其他事務需要更新對應行,在申請全局鎖的時候會被拒絕,如果是查詢操作,且不能未提交讀,可以帶上for update, seata會為select for updata查詢出的數據檢查是否有全局鎖。
我的注解版(目前僅分析了AT模式):