分佈式事務

  • ACID(數據庫事務要知足的要求):原子性與隔離性的要求致使事務操做比起非事務操做更加消耗系統性能
  1. Atomic(原子性) : 事務必須是原子的工做單元(保證操做要麼成功要麼失敗)
  2. Consistent(一致性) :事務完成時,必須使全部數據都保持一致狀態
  3. Isolation(隔離性) :併發事務所作的修改必須和其餘事務所作的修改是隔離的(經過鎖來實現)
  4. Duration(持久性) :事務完成以後,對系統的影響是永久性的
  • MySQL裏的事務處理過程
  1. 記錄redo(記錄事務修改之後的數據)和undo(記錄事務修改以前的數據)的log文件,確保日誌在磁盤上的持久化
  2. 更新數據記錄(更改數據庫中的值)
  3. 提交事務,使用redo中的日誌寫入commit記錄(事務處理完,清理undo文件,釋放鎖(確保隔離性),刷新redo日誌)
  • 分佈式事務:分佈式事務產生的緣由
    • 數據庫分表分庫

    • 服務SOA化

    • 在分佈式系統中,每個機器節點雖然都可以明確知道本身執行的事務是成功仍是失敗,可是卻無法知道其它分佈式節點的事務執行狀況。所以,當一個事務要跨越多個分佈式節點的時候(好比:下單流程,下單系統和庫存系統可能就是分別部署在不一樣的分佈式節點中),爲了保證事務能夠知足ACID,就要引用一個協調者(Cooradinator)。其它的節點被稱爲參與者(Participant)。協調者負責調度參與者的行爲,並最終決定這些參與者是否要把事務進行提交。
  • X/OpenDTP事務模型(分佈式事務解決方案)
  1. X/Open Distributed Transaction Processing Reference Model(全稱:分佈式事務處理模型)。
  2. X/Open是一個組織機構,定義出的一套分佈式事務標準(具體的實現是由各個廠商來實現的)定義了規範的API接口。
  • 2PC(two -phase-commit), 用來保證分佈式事務的完整性(一個協議)
  1. J2EE 遵循了X/open DTP規範,設計並實現了java裏面的分佈式事務編程接口規範-JTA
  2. XA是X/Open DTP定義的中間件數據庫之間的接口規範。 XA接口函數由數據庫廠商提供(數據庫層面用的都是XA規範)
  • X/OpenDTP角色:AP觸發指令,TM協調調度RM,RM具體執行指令
  1. AP  :application (應用節點)         
  2. RM :resouces manager   資源管理器。 (數據庫)
  3. TM :transaction manager  事務管理器,事務協調者
  • 2PC(two -phase-commit)(2階段提交)
    • 階段一:提交事務請求(投票)

  1. TM向全部的AP發送事務內容,詢問是否能夠執行事務的提交操做,並等待各個AP的響應
  2. 執行事務,各個AP節點執行事務操做,將undo和redo信息記錄到事務日誌中,儘可能把提交過程當中所消耗時間的操做和準備都提早完成確保後續事務提交的成功率
  3. 各個AP向TM反饋事務詢問的響應,各個AP成功執行了事務操做,那麼反饋給TM yes的response;若是AP沒有成功執行事務,就反饋TM no的response (只要任何AP返回no,就回滾(中斷事務提交)保證原子性)
    • 階段二:執行事務提交

 

假設一個事務的提交過程總共須要30s, 其中prepare(提交以前的準備)操做須要28(事務日誌落地磁盤及各類io操做),而真正commit只須要2s那麼,commit階段發生錯誤的機率和prepare相比,2/28 (<10%),只要第一個階段成功,那麼commit階段出現失敗的機率就很是小,大大增長了分佈式事務的成功機率。html

  • 中斷事務提交java

 

  • 2PC存在的問題
  1. 數據一致性問題
  2. 同步阻塞
  • 3PC(three phase commit)(2pc上的升級改造)
  1. 階段一:canCommit:TM向AP發送can(是否能夠執行,能夠返回yes,不能夠返回no)(只要有一個no,就中斷事務)
  2. 階段二:preCommit:TM根據階段一的結果,判斷是否能夠執行commit操做(向AP發送能夠操做請求),預執行
  3. 階段三:doCommit:最後執行,全部參與者AP都肯定能夠commit
  • 分佈式事務的實現
  1. JOTM(java open transaction manager):https://www.cnblogs.com/huangjingzhou/articles/2012014.html
  2.  Atomikos(開源項目集成了spring):https://www.2cto.com/kf/201801/714523.html
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息