TP和AP最重要的區別就是事物。事務是指對系統進行的一組操做,爲了保證系統的完整性,事務須要具備ACID特性,具體指原子性(Atomic)一致性(Consistency)隔離性(Isolation)持久性(Durability)。數據庫
微軟Build 2017發佈的Cosmos數據庫比較有意思,同時支持5個級別一致性。服務器
一致性指的是事務的執行必須使資料庫從一個一致性狀態遷移至另外一個一致性狀態,事務的一致性決定了一個系統設計和實現的複雜度。併發
最多見的兩種模式是強制一致性(Strong consistency)與最終一致性(EventuallyConsistency),但Azure Cosmos DB額外提供了介於上述二者之間的 有邊界一致性( Bounded Staleness)、事物一致性(Session)與單調一致性(ConsistentPrefix)等模式,容許開發人員依據程式的需求選擇適用的模式。分佈式
事務能夠不一樣程度的一致性:ide
強一致性:讀操做能夠當即讀到提交的更新操做性能
Bounded Staleness:提交的更新操做,不必定當即會被讀操做讀到,此種狀況會存在一個不一致窗口,指的是讀操做能夠讀到最新值的一段時間。ui
會話一致性:保證客戶端和服務器交互的會話過程當中,讀操做能夠讀到更新操做後的最新值。google
單調一致性:若是一個進程已經讀到一個值,那麼後續不會讀到更早的值。spa
最終一致性:是弱一致性的特例。事務更新一份數據,最終一致性保證在沒有其餘事務更新一樣的值的話,最終全部的事務都會讀到以前事務更新的最新值。若是沒有錯誤發生,不一致窗口的大小依賴於:通訊延遲,系統負載等。設計
Cosmos DB在許多方面借鑑了DocumentDB,這不足爲奇。其中一個方面就是擁有可調整的一致性模型(consistency model)。若是你平時不常考慮全局分佈式數據庫,那麼一致性模型對你來講根本不是那麼重要,可是大多數與之競爭的數據庫系統(包括谷歌最近發佈的Cloud Spanner,https://cloud.google.com/spanner/)只有兩種一致性模型:強一致性(strong consistency)和最終一致性(eventualconsistency)。好比說,就強一致性而言,只要數據被寫入到數據庫,全部的不一樣節點(這些節點可能分佈於全球各地的數據中心)都要先就一個新的值達成一致,以後新的值纔出如今應用程序中。任什麼時候刻,任何用戶或節點均可以讀到最近一次成功更新的副本數據。因爲這種方法增添了延遲,這在性能方面顯然存在着一些不足。最終一致性其實是一種比較寬容的系統;全部節點並不一樣時更新,而是隻有在一段時間沒有任何最近的更新後,才就某個值達成一致。
CosmosDB不一樣尋常的地方在於,它提供了不一樣的一致性模型,那樣用戶能夠在得到多強的一致性與承受多大的性能開銷之間做一個取捨。好比說,對於Cosmos DB(以及以前的DocumentDB)而言,那意味着,你能夠選擇這種一致性模型:容許讀取操做比寫入操做只延後某一段時間(毫秒級),也能夠選擇這種一致性模型:專一於爲某種特定的客戶會話提供一致性(好比在相似Twitter的應用中),可是每一個用戶在同一時間(或者以徹底同樣的順序)看到每次寫入的數據又不是那麼重要。
ACID另外三個概念分佈是:
1.原子性(Atomic)
一個事務包含多個操做,這些操做要麼所有執行,要麼全都不執行。實現事務的原子性,要支持回滾操做,在某個操做失敗後,回滾到事務執行以前的狀態。
回滾其實是一個比較高層抽象的概念,大多數DB在實現事務時,是在事務操做的數據快照上進行的(好比,MVCC),並不修改實際的數據,若是有錯並不會提交,因此很天然的支持回滾。
而在其餘支持簡單事務的系統中,不會在快照上更新,而直接操做實際數據。能夠先預演一邊全部要執行的操做,若是失敗則這些操做不會被執行,經過這種方式很簡單的實現了原子性。