目前關於事務的幾大理論包括:ACID特性(數據庫的特性),CAP分佈式理論,以及BASE等。數據庫
一、A(原子性):一個事務包含多個操做,這些操做要麼所有執行,要麼全都不執行;實現事務的原子性,要支持回滾操做,在某個操做失敗後,回滾到事務執行以前的狀態。網絡
二、C(一致性):一致性是指事務使得系統從一個一致的狀態轉換到另外一個一致狀態,保證數據的完整性。事務的一致性決定了一個系統設計和實現的複雜度,也致使了事務的不一樣隔離級別。併發
三、I(隔離性):保證事務不受外部併發操做,在獨立環境執行。多個併發的事務同時訪問一個數據庫時,一個事務不該該被另外一個事務所幹擾,每一個併發的事務間要相互進行隔離。框架
四、D(持久性):指一個事務一旦被提交了,那麼對數據庫中的數據的改變是永久的,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。異步
一、C(一致性):在分佈式環境下,一致性是指多個節點數據是否一致;分佈式
二、A(可用性):服務一直保持可用的狀態,當用戶發出一個請求,服務能在必定的時間內返回結果;不少中間件或者開源框架都支持高可用方案(Redis、Zookeeper等);性能
三、P(分區容忍性):特指對網絡分區的容忍性;分佈式系統在遇到任何的 網絡分區(分佈式系統中不一樣節點部署在不同的網絡環境) 故障的時候,仍然須要保證對外提供知足一致性和可用性的服務設計
BA: Basic Availability 基本業務可用性;日誌
S: Soft state 柔性狀態;中間件
E: Eventual consistency 最終一致性;
一、在事務併發操做時,可能出現的問題有以下三種:
補充 MVCC:多版本併發控制。是一種併發控制的方法,你們應該知道,鎖機制能夠控制併發操做,可是系統開銷比較大(悲觀鎖),而MVCC(樂觀鎖)能夠在大多數狀況下代替行級鎖,能夠下降系統開銷。 在MYSQL中,MyISAM使用的是表鎖,InnoDB使用的是行鎖。而InnoDB的事務分爲四個隔離級別,其中默認的隔離級別REPEATABLE READ須要兩個不一樣的事務相互之間不能影響,並且還能支持併發,這點悲觀鎖是達不到的,因此REPEATABLE READ採用的就是樂觀鎖,而樂觀鎖的實現採用的就是MVCC。正是由於有了MVCC,才造就了InnoDB強大的事務處理能力
樂觀鎖讀寫事務,在真正的提交以前,不加讀/寫鎖,而是先看一下數據的版本/時間戳,等到真正提交的時候再看一下版本/時間戳,若是兩次相同,說明別人期間沒有對數據進行過修改,那麼就能夠放心提交
二、針對事務併發致使的問題,經過事務隔離來解決,事務隔離級別從低到高以下:
一般,在項目爲了性能的考慮會對隔離性進行折中
一、兩階段提交:
在兩階段提交中,系統分爲兩類節點:協調者和參與者
(1)請求階段(決策階段):協調者將通知事務參與者準備提交或取消事務,而後進入表決過程;在表決過程當中,參與者將告知協調者本身的決策:贊成(事務參與者本地做業執行成功)或取消(本地做業執行故障)
(2)提交階段:在該階段,協調者將基於第一個階段的投票結果進行決策:提交或取消。 當且僅當全部的參與者贊成提交事務協調者才通知全部的參與者提交事務,不然協調者將通知全部的參與者取消事務。 參與者在接收到協調者發來的消息後將執行響應的操做
缺點:
全部兩階段提交沒法解決的問題就是:沒法保證事務執行的完整性(數據的一致性)
二、三階段提交:
與兩階段提交協議的區別:三階段提交協議在協調者和參與者之間引入了超時機制; 在2PC的準備階段和提交階段之間,插入預提交階段,使3PC擁有CanCommit、PreCommit、DoCommit三個階段。 PreCommit是一個緩衝,保證了在最後提交階段以前各參與節點的狀態是一致的
(1)CanCommit階段:3PC的CanCommit階段其實和2PC的準備階段很像。 協調者向參與者發送commit請求,參與者響應是否能夠提交。
(2)PreCommit階段:協調者根據參與者的響應狀況來決定是否能夠繼續事務的PreCommit操做
(3)DoCommit階段:該階段進行真正的事務提交
缺點:若是進入PreCommit後,協調者發出的是abort請求,假設只有一個參與者收到並進行了abort操做, 而其餘對於系統狀態未知的參與者會根據3PC選擇繼續Commit,此時系統狀態發生不一致性
分佈式系統的一個難點就是:「網絡通訊的不可靠」,只能經過「確認機制」、「重試機制」、「補償機制」等各方面來解決一些問題。在綜合考慮可用性、性能、實現複雜度等各方面的狀況上,比較好的選擇是「異步確保最終一致性」(確認機制),只是具體實現方式上有一些差別