事務,在數據庫中指的是操做數據庫的最小單位,往大了看,事務是應用程序中一系列嚴密的操做,全部操做必須成功完成,不然在每一個操做中所做的全部更改都會被撤消。git
那爲何會有分佈式事務呢?單機事務是經過將操做限制在一個會話內經過數據庫自己的鎖以及日誌來實現ACID.由於引入了分佈式架構,因此事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位於不一樣的分佈式系統的不一樣節點之上.簡單說就是多各數據庫之間沒法保證保證各自的操做同時成功或同時失敗。github
Seata:Simple Extensible Autonomous Transaction Architecture,簡易可擴展的自治式分佈式事務管理框架,其前身是fescar。阿里巴巴GTS的開源版實現,是一種分佈式事務的解決方案。sql
Transaction Coordinator(TC):管理全局的分支事務的狀態,用於全局性事務的提交和回滾。
Transaction Manager(TM):事務管理器,用於開啓全局事務、提交或者回滾全局事務,是全局事務的開啓者。
Resource Manager(RM):資源管理器,用於分支事務上的資源管理,向TC註冊分支事務,上報分支事務的狀態,接受TC的命令來提交或者回滾分支事務。數據庫
Seata 的設計思路是將一個分佈式事務能夠理解成一個全局事務,下面掛了若干個分支事務,而一個分支事務是一個知足 ACID 的本地事務,所以咱們能夠操做分佈式事務像操做本地事務同樣。Seata 的事務提交方式跟 XA 協議的兩段式提交在整體上來講基本是一致的,但XA 協議它依賴的是數據庫層面來保障事務的一致性,也便是說 XA 的各個分支事務是在數據庫層面上驅動的,因爲 XA 的各個分支事務須要有 XA 的驅動程序,一方面會致使數據庫與 XA 驅動耦合,另外一方面它會致使各個分支的事務資源鎖定週期長,因此性能較差。api
Seata 在數據源作了一層代理層,因此咱們使用 Seata 時,咱們使用的數據源實際上用的是 Seata 自帶的數據源代理 DataSourceProxy,Seata 在這層代理中加入了不少邏輯,主要是解析 SQL,把業務數據在更新先後的數據鏡像組織成回滾日誌,並將 undo log 日誌插入 undo_log 表中,保證每條更新數據的業務 sql 都有對應的回滾日誌存在。這樣作的好處就是,本地事務執行完能夠當即釋放本地事務鎖定的資源,而後向 TC 上報分支狀態。當 TM 決議全局提交時,就不須要同步協調處理了,TC 會異步調度各個 RM 分支事務刪除對應的 undo log 日誌便可,這個步驟很是快速地能夠完成;當 TM 決議全局回滾時,RM 收到 TC 發送的回滾請求,RM 經過 XID 找到對應的 undo log 回滾日誌,而後執行回滾日誌完成回滾操做。服務器
上面說的是seata的模式模式AT,seata也針對TCC作了適配兼容,支持TCC事務方案,原理前面已經介紹過,基本思路就是使用侵入業務上的補償及事務管理器的協調來達到全局事務的一塊兒提交及回滾。架構