答:指一次大的操做由不一樣的小操做組成的,這些小的操做分佈在不一樣的服務器上,分佈式事務須要保證這些小操做要麼所有成功,要麼所有失敗。從本質上來講,分佈式事務就是爲了保證不一樣數據庫的數據一致性。html
當數據庫單表數據達到千萬級別,就要考慮分庫分表,那麼就會從原來的一個數據庫變成多個數據庫。例如若是一個操做即操做了01庫,又操做了02庫,並且又要保證數據的一致性,那麼就要用到分佈式事務。sql
所謂的SOA化,就是業務的服務化。例如電商平臺下單操做就會產生調用庫存服務扣減庫存和訂單服務更新訂單數據,那麼就會設計到訂單數據庫和庫存數據庫,爲了保證數據的一致性,就須要用到分佈式事務。數據庫
總結:其實上面兩種場景,歸根究竟是要操做多數據庫,而且要保證數據的一致性,而產生的分佈式事務的。服務器
XA是一個分佈式事務協議,由Tuxedo提出。XA中大體分爲兩部分:事務管理器和本地資源管理器。其中本地資源管理器每每由數據庫實現,好比Oracle、Mysql等數據庫都實現了XA接口,而事務管理器做爲全局的調度者,負責各個本地資源的提交回滾。網絡
XA實現分佈式事務的原理以下:併發
二階段提交看起來確實可以提供原子性的操做,可是它存在幾個缺點:分佈式
一、同步阻塞問題:執行過程當中,全部參與節點都是事務阻塞型的。當參與者佔有公共資源時,其餘第三方節點訪問公共資源不得不處於阻塞狀態。高併發
二、單點故障:因爲(事務管理器)協調者的重要性,一旦協調者發生故障。(本地資源管理器)參與者會一直阻塞下去。尤爲在第二階段,協調者發生故障,那麼全部的參與者還都處於鎖定事務資源的狀態中,而沒法繼續完成事務操做。(若是是協調者掛掉,能夠從新選舉一個協調者,可是沒法解決由於協調者宕機致使的參與者處於阻塞狀態的問題)性能
三、數據不一致:在二階段提交的階段二中,當協調者向參與者發送commit請求以後,發生了局部網絡異常或者在發送commit請求過程當中協調者發生了故障,這會致使只有一部分參與者接收到了commit請求。而在這部分參與者接到commit請求以後就會執行commit操做。可是其餘部分未接到commit請求的機器沒法執行事務提交。因而整個分佈式系統便出現了數據不一致的現象。優化
四、二階段沒法解決的問題:參與者在發出commit消息以後宕機,而惟一接收到這條消息的協調者同時也宕機了。那麼即便協調者經過選舉協議產生了新的協調者,這條事務的狀態也是不肯定的,沒人知道事務是否被已經提交了。
3PC其實在2PC的基礎上增長了CanCommit階段,是2PC的變種,並引入了超時機制。一旦事務參與者遲遲沒有收到協調者的Commit請求,就會自動進行本地commit,這樣相對有效的解決了協調者單點故障的問題。可是,性能和數據一致性問題沒有根本解決。
3PC分爲三個階段:CanCommit、PreCommit、DoCommit
它跟2PC的 準備階段很像,協調者向參與者發送commit請求,參與者若是能夠提交就返回Yes響應,不然返回No響應。
協調者根據參與者的響應狀況來決定是否能夠進行事務的PreCommit操做。根據響應狀況,有如下兩種可能:
該階段進行真正的事務提交,也能夠分爲如下兩種狀況:
相對於2PC而言,3PC對於協調者和參與者都設置了超時時間,而2PC只有協調者才擁有超時時間機制。這個優化解決了,參與者在長時間沒法與協調者節點通信的狀況下,沒法釋放資源的問題,由於參與者自身擁有超時機制會在超時後,自動進行本地commit從而進行釋放資源。而這種機制也側面下降了整個事務的阻塞時間和範圍。可是仍然沒有解決數據一致性問題,即在參與者收到PreCommit請求後等待最終指令,若是此時協調者沒法與參與者正常通訊,會致使參與者繼續提交事務,形成數據不一致。
TCC(Try-Confirm-Cancel)又稱補償事務。它實際上與2PC、3PC同樣,都是分佈式事務的一種實現方案而已。它分爲三個操做:
TCC事務的處理流程與2PC兩階段提交相似,不過2PC一般都是在DB層面,而TCC本質上就是應用層面的2PC,須要經過業務邏輯來實現。它的優點在於,可讓應用本身定義數據庫操做的粒度,使得下降鎖衝突、提交吞吐量。
不過對應用的侵入性很是強,業務邏輯的每一個分支都須要實現try、confirm、cancel三個操做。
所謂的消息事務就是基於消息中間件的兩階段提交,本質上是中間件的一種特殊利用,他是將本地事務和發消息放在一個分佈式事務裏,保證要麼本地操做成功而且對外發消息成功,要麼二者都失敗,開源的RocketMQ就支持這一特性,具體原理以下:
步驟以下:
一、:服務A向消息中間件發送一條預備消息。
二、消息中間件保存預備消息並返回成功。
三、服務A執行本地事務。
四、服務A發送提交消息給消息中間件,服務B接收到消息以後執行本地事務。
基於消息中間件的兩階段提交每每用在高併發場景下,將一個分佈式事務拆成一個消息事務(服務A的本地操做+發消息)+服務B的本地操做,其中服務B的操做由消息驅動,只要消息事務成功,那麼服務A必定成功,消息也必定發出來了,這時候服務B會收到消息去執行本地操做,若是本地操做失敗,消息會重投,直到服務B操做成功,這樣就變相地實現了A與B的分佈式事務。
以上幾個步驟可能存在異常狀況,如今對其進行分析:
參考文章:
一、https://www.cnblogs.com/xifenglou/p/8440836.html
二、https://blog.csdn.net/skyie53101517/article/details/80741868
三、https://www.cnblogs.com/zcjcsl/p/7989792.html