由集中式系統到分佈式系統的發展,事務的原則也有原先的ACID發展成了CAP/BASE。數據庫
ACID
事務(Transaction)是由一系列對系統中數據進行訪問和更新的操做鎖組成的一個程序執行邏輯單元(Unit),狹義上的事務特指數據庫事務。
事務具備四個特徵,分別是原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),簡稱事務的ACID特性。網絡
原子性:事務必須是一個原子的操做序列單元,要麼所有成功,要麼所有失敗。
一致性:事務的執行不能破壞數據庫數據的完整性和一致性,一個事務在執行以前和執行以後,數據庫都必須處於一致性狀態。
隔離性:併發的事務是相互隔離的,一個事務的執行不能被其餘事務干擾,定義了4個事務隔離級別。
持久性:事務一旦提交,他對數據庫中對應數據的狀態變動就應該是永久性的。架構
CAP和BASE理論
集中式系統中事務能夠容易的知足ACID這幾個特性,可是對於一個高訪問量、高併發的互聯網分佈式系統來講,若是咱們指望實現一套嚴格知足ACID特性的分佈式事務,極可能出現的狀況就是在系統的可用性和嚴格一致性之間出現衝突,由於當咱們要求分佈式系統具備嚴格一致性時,極可能就須要犧牲掉系統的可用性。可用性和一致性又是分佈式系統不可或缺的兩個屬性,在可用性和一致性之間永遠沒法存在一個一箭雙鵰的方案,因而出現了諸如CAP和BASE這樣的分佈式系統經典理論。併發
CAP定理
一個分佈式系統不可能同時知足一致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance)這三個基本需求,最多隻能同時知足其中的兩項。分佈式
一致性:全部節點在同一時間具備相同的數據,注:這裏的一致性和ACID中的一致性是不同的
可用性:服務一直可用,並且是正常響應時間
分區容錯性:分佈式系統在遇到某節點或網絡分區故障的時候,仍然可以對外提供知足一致性和可用性的服務。高併發
CAP證實
關於CAP定理中爲何只能同時知足其中的兩項,這裏能夠作一個簡單的證實:
前提:對於一個分佈式系統而言,分區容錯性能夠說是一個最基本的要求。由於既然是一個分佈式系統,那麼分佈式系統中的組件必然須要被部署到不一樣的節點,不然也就無所謂分佈式系統了性能
假設網絡中有2個節點N1和N2,N1和N2上分別安裝了數據庫D1(主)和D2(備)造成主備模式,D1(主)負責寫而且讀,D2(備)分擔一部分讀
正常狀況下:D1(主)寫完數據,同步到D2(備),讀取D2能夠讀到最新的數據
非正常狀況下:做爲一個分佈式系統,它和單機系統的最大區別,就在於網絡,如今假設一種極端狀況,N1和N2之間的網絡斷開了;D1(主)寫完數據,D2(備)沒有更新到最新的數據;這時候怎麼辦,有2個選擇:第一,犧牲數據一致性,響應舊的數據給用戶;第二,犧牲可用性,阻塞等待,直到網絡鏈接恢復,數據更新操做完成以後,再給用戶響應最新的數據。spa
BASE理論
BASE是Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個短語的簡寫。很明顯BASE理論更加傾向知足CAP理論中的AP,既知足可用性,分區容忍性的系統,一般可能對一致性要求低一些。架構設計
CAP、ACID以及BASE之間的關係
網上看到過一張圖片,感受對三者之間的關係描述的很清晰,以下圖所示:設計
CAP理論中根據傾向的不一樣:
CA – 單點集羣,知足一致性,可用性的系統,一般在可擴展性上不太強大(ACID)
AP – 知足可用性,分區容忍性的系統,一般可能對一致性要求低一些(BASE)
CP – 知足一致性,分區容忍必的系統,一般性能不是特別高(BASE)我的認爲裏面的?也能夠寫成BASE
其實咱們還能夠從數據庫這個角度來看:
關係型數據庫和非關係型數據庫也能在CAP理論中獲得體現,以下圖所示(來源網上):
關係型數據庫(RDBMS)遵循ACID原則,非關係型數據庫遵循BASE原則
總結
ACID強一致性模型,而BASE提出經過犧牲強一致性來得到可用性但最終達到一致狀態;在實際的分佈式場景中,不一樣業務單元和組件對數據一致性的要求是不一樣的,所以在具體的分佈式系統架構設計中,ACID特性和BASE理論每每會結合在一塊兒使用。