數據庫ACID(酸):原子性,一致性,隔離性,持久性。數據庫
CAP理論:一個分佈式系統最多能知足一致性C,可用性A,分區容錯性P,三項中的兩個。網絡
C:更新操做成功且返回請求方完成後,全部節點在同一時間的數據徹底一致。分佈式
A:用戶在訪問數據時能獲得及時地響應。ide
P:分佈式系統在某節點或網絡分區故障時,依然能夠對外提供知足CA的服務。日誌
BASE(鹼)理論:作不到強一致性,但應該作到最終一致性。事務
BA:基本可用。分佈式系統出現故障時,容許損失部分可用性,保證核心可用。同步
S:柔性狀態。容許中間態,且不影響總體可用性。如MySQL主從複製有延時,就是柔性狀態的體現。it
E:最終一致性。全部數據副本通過必定時間後,最終達到一致。其必致使S。class
Paxos協議:在多機間通訊不存在僞造篡改的前提下,可經過Paxos協議達成一致性。成本是發給Paxos系統的信息,至少同步發給一半以上的機器確認後,纔算成功。請求
柔性事務解決分佈式事務問題:
一、引入日誌和補償機制。事物日誌記錄事物開始、結束狀態、事務參與者信息。參與者節點根據需求作重試或回滾日誌。
根據日誌記錄找回事務執行的當前狀態,並據此決定是重試仍是回滾。實踐中,其問題在於對異常處理和回滾支持不夠,出了問題,人力維護的成本高。
二、可靠消息傳遞。
網絡通訊危險期:請求發出後,響應返回前,網絡發生了故障,請求方不知服務端是否已成功地處理了請求。
節點間網絡通信,其結果有三:成功、失敗、未知。
爲保證消息傳遞的可靠性,消息至少發一次,有可能發屢次消息。消費者程序必須實現冪等。以前文章有述。
三、無鎖。加鎖會形成瓶頸,不加鎖,又必須保證隔離性。
A:不回滾。事物發生異常也不回滾,經過各類補償機制,繼續走正向流程,即使中間狀態對外可見。由於不回滾,也不會形成髒讀。
髒讀:讀取未提交。
不可重複讀:先後屢次讀取,數據不一致。讀取已提交。
幻讀:先後屢次讀取,數據總量不一致。
髒讀和不可重複讀針對的都是更新操做,幻讀針對的是插入操做。
B:變化明細表。下單扣庫存,不扣減商品表的庫存數,而是增長一條預減記錄。付款成功後再扣減商品表的庫存數。付款前須要實際庫存數的公式以下:
實際庫存數=商品表庫存數-商品預減記錄的庫存數總和。
C:樂觀鎖。版本號、時間戳。前文有述。