分布式事務

  事務機制是可以保證一系列寫操作要么全部完成,要么全部不會完成,不會發生只完成一系列中一兩個寫操作,事務機制缺省一般由數據庫完成,也可以通過應用程序實現(如Java的JTA等)

  事務由四個屬性,簡稱ACID:

  1. Atomicity原子性:一個事務的所有系列操作步驟被看成是一個操作,也就是一個原子操作,打個比喻:多個SQL語句如同一個SQL執行一樣。
  2. Consistency一致性:如果兩個以上數據表有關聯,那么更新一個表同時另外一個表也要一起更新,否則兩個表的數據記錄就發生不一致了。
  3. Isolation隔離性:主要用于實現并發控制, 隔離能夠確保并發執行的事務能夠順序一個接一個執行,通過隔離,一個未完成事務不會影響另外一個未完成事務,隔離是通過用悲觀或樂觀鎖機制實現的。
  4. Durability耐久性:一個成功的事務將永久性地改變系統的狀態,所以在它結束之前,所有導致狀態的變化都記錄在一個持久的事務日志中。如果我們的系統突然受到系統崩潰或斷電,那么所有未完成已提交的事務可能會重演。

  關系數據庫提供默認不同級別的ACID,完全真正嚴格的ACID會導致性能下降,因此,事務代表的可靠性和性能擴展性是一對矛盾,如何進行平衡是架構設計的主要考量,特別是在分布式系統中如何保證ACID事務是一項極具有挑戰力的工作。

2PC

  2PC(2 phase commit)是一種分布式事務進行兩段事務提交的簡稱,JavaEE的JTA/XA是2PC一種實現。2PC適合有多個數據源情況下統一按照ACID原則完成操作,比如一個操作涉及三個數據庫的三個表a b c,如何保證這三個表的數據同時操作完成,保證在同一邏輯下的一致性,這是2PC關注所在,如果沒有2PC,有可能a表修改成功,b表和c表沒有修改成功,那么就出現不一致性。

  下圖是傳統分布式2PC兩段事務提交示意圖

  兩段提交協議是一種分布式資源的原子確認協議,這個協議是通過兩段過程完成業務數據的更改:第一段是預準備階段,事務管理器通知所有分布式資源準備接受提交或退出事務,第二階段,事務管理器安裝每個分布式資源的回應情況決定是真正提交完成事務或者退出事務。在第一階段,我們通過服務的JTA事務修改的數據庫數據并沒有真正寫入數據庫,只有最后階段完成時才真正寫入。

  以轉賬案例為說明,A賬戶轉到B賬戶100元,A賬戶余額應該減去100元,而B帳號增加100元,如果A賬戶在上海機房服務器,B帳號在北京機房,那么通過2PC保證這種加減一致性,如果沒有2PC,A帳號已經減去100元,但是B賬戶卻沒有增加100元,整個操作也沒有報錯回滾,所以,2PC是保證業務邏輯正確性,精確性的。

  注意:2PC的這種分布式數據一致性與CAP定理中分布式數據一致性是有區別的。

2PC的問題

  2PC的問題主要由于并發性能不高,由于一段事務需要經過兩個階段,這兩個階段需要將資源上鎖,而分布式環境中網絡抖動是不可避免的,因此容易造成事務失敗,或者由于事務正在進行中,鎖定資源太多,比如鎖定數據表記錄太多,導致其他事務等待時間較長。區塊鏈等技術由于采取每個區塊鏈接到上一個區塊,類似一個LinkedList,雖然保證了分布式數據的可靠性,但是吞吐量和并發性能卻不高,兩者機制是差不多,2PC性能反而會好一些,因為數據庫資源相對是集中的。

  傳統2PC分布式事務能夠保證數據可靠性,但是無法提高吞吐量和并發性能,如何進行權衡?這就需要引入分布式系統的定理:CAP定理。

  通過降低傳統2PC的強一致性,使用弱一致性替代,從而就能在出現網絡抖動導致分區的情況下提高可用性,等網絡連通正常后,再進行數據同步復制,保證數據的一致性,這種方式也稱為柔性事務。其中Saga事務是一種分布式柔性事務的探索。

  還有一種TCC(Try-Confirm-Cancel)其實是JTA 2PC的一種補充,TCC中第一個C是提交的意思,TCC中第二個C如果看成是類似2PC的回滾Rollback,那么其實就是兩段提交;如果將第二個C理解為補償有些牽強,補償的意思是不斷新增補充,而不是撤銷回退原來的動作,補償本身概念有始終向前的意思,既然有補償概念,就需要有過去動作的歷史記錄,沒有歷史記錄你怎么補償,你如果撤銷刪除了以前的動作就不是補償,如同你把財務賬本上一條記錄用涂改液擦除了,那是要犯法的,補償就是你不能回退擦除以前的記錄,只能新增一條記錄,來沖抵以前的錯誤記錄,所以,談到補償肯定需要類似賬本的流水記錄的(區塊鏈本身就是一個賬本)。

  分布式事務有很多探索,比如使用Paxo/Raft實現分布式環境下的數據高一致性,Google的Spanner和FoundationDB以及微軟的Azure Cosmos DB都屬于分布式強一致性事務的數據庫。

  還有一種分布式事務機制,使用事件溯源方式,再引入Kafka這樣的原子消息系統,確保消息送達目標,同時保證在目標實現單寫方式(Stream流),這種使用事件同步替代狀態同步,從而能實現間接實現多個節點之間的數據最終一致性。這個思路可見本站Jdon框架的轉賬演示DEMO.

什么是數據庫ACID

關系數據庫是如何工作的?

SQL入門教程

JDBC基礎教程

JDBC事務鎖基礎教程

JDBC悲觀鎖與樂觀鎖基礎教程

JDBC隔離級別基礎教程

ACID和CAP的詳盡比較

業界最大謊言:大部分關系數據庫并不真的支持ACID

Java持久鎖總結

數據庫系統并發控制原理

PostgreSQL、Oracle/MySQL和SQL Server的MVCC實現原理方式

最終一致性其實比MVCC簡單

線性化與串行化比較

CAP定理

分布式系統Paxos算法

分布式系統Raft算法

為什么大部分NoSQL不提供分布式事務?

比特幣區塊鏈是一種分布式的事件流日志

使用Spring Cloud和Reactor在微服務中實現EventSourcing

如何提高JDBC插入速度?

可擴展伸縮架構中的狀態

為什么分布式微服務很難?

分布式事務可能是個偽概念

兩個領域事件驅動的開源項目介紹

CAP定理在分布式系統設計中的最新應用

超越分布式事務

微服務分布式事務Saga模式簡介

從CRUD編程切換到事件溯源和區塊鏈編程

YugaByte DB:高性能的分布式ACID事務的開源數據庫?

Eventuate:基于操作CRDT的服務框架

替代傳統事務的并發建議

Event Sourcing在分布式系統中應用

LMAX微服務級別的分布式事務實現

著名的分布式事務數據庫谷歌Spanner設計有坑!

Saga與工作流引擎比較

分布式共識如何運作?

數據庫數據復制技術入門

兩段事務提交2PC的缺點和解決之道

DDD實踐:在SpringBoot中跨微服務通過發件箱模式實現分布式事務機制 - Hans-Peter Grahsl

分布式事務的替換者:在線事件處理OLEP(事件溯源)

數據庫也可以像電腦一樣組裝:使用Kafka建立關系數據庫 – Robert Yokota

參考話題:

#Saga事務 #事務架構 #JTA事務 #分布式事務

#微服務專題 #數據庫 #工作流 #區塊鏈

一级黄色录像影片 夫妻性生活影片 免费在线观看 一级a做爰片