資料庫事務
事務的基本特性:
事務有4個非常重要的特性,即我們常說的(acid)
atomicity(原子性):是說事務是乙個不可分割的整體,所有操作要麼全做,要麼全不做;只要事務中有乙個操作出錯,回滾到事務開始前的狀態的話,那麼之前已經執行的所有操作都是無效的,都應該回滾到開始前的狀態。
consistency(一致性):是說事務執行前後,資料從乙個狀態到另乙個狀態必須是一致的,比如a向b轉賬(a、b的總金額就是乙個一致性狀態),不可能出現a扣了錢,b卻沒收到的情況發生。
isolation(隔離性):多個併發事務之間相互隔離,不能互相干擾。關於事務的隔離性,可能不是特別好理解,這裡的併發事務是指兩個事務操作了同乙份資料的情況;而對於併發事務操作同乙份資料的隔離性問題,則是要求不能出現髒讀、幻讀的情況,即事務a不能讀取事務b還沒有提交的資料,或者在事務a讀取資料進行更新操作時,不允許事務b率先更新掉這條資料。而為了解決這個問題,常用的手段就是加鎖了,對於資料庫來說就是通過資料庫的相關鎖機制來保證。
durablity(永續性):事務完成後,對資料庫的更改是永久儲存的。
什麼是分布式事務
其實分布式事務從實質上看與資料庫事務的概念是一致的,既然是事務也就需要滿足事務的基本特性(acid),只是分布式事務相對於本地事務而言其表現形式有很大的不同
分布式理論:一致性協議 2pc
什麼是 2pc
2pc ( two-phase commit縮寫)即兩階段提交協議,是將整個事務流程分為兩個階段,準備階段(prepare phase)、提交階段(commit phase),2是指兩個階段,p是指準備階段,c是指提交階段。在計算機中部分關聯式資料庫如oracle、mysql支援兩階段提交協議
準備階段(prepare phase):事務管理器給每個參與者傳送prepare訊息,每個資料庫參與者在本地執行事務,並寫本地的undo/redo日誌,此時事務沒有提交。 (undo日誌是記錄修改前的資料,用於資料庫回滾,redo日誌是記錄修改後的資料,用於提交事務後寫入數 據檔案)
提交階段(commit phase):如果事務管理器收到了參與者的執行失敗或者超時訊息時,直接給每個參與者傳送回滾(rollback)訊息;否則,傳送提交(commit)訊息;參與者根據事務管理器的指令執行提交或者回滾操作,並釋放事務處理過程中使用的鎖資源。注意:必須在最後階段釋放鎖資源。
協議說明:
顧名思義,二階段提交就是將事務的提交過程分成了兩個階段來進行處理。流程如下:
成功提交事務
事務詢問
協調者向所有的參與者傳送事務內容,詢問是否可以執行事務提交操作,並開始等待各參與者的響應。
執行事務 (寫本地的undo/redo日誌)
各參與者向協調者反饋事務詢問的響應
總結: 各個參與者進行投票是否讓事務進行.
什麼是ack
ack 確認字元,在資料通訊中,接收站發給傳送站的一種傳輸類控制字元。表示發來的資料已確認接收無誤傳送提交請求:
協調者向所有參與者發出 commit 請求。
事務提交:
參與者收到 commit 請求後,會正式執行事務提交操作,並在完成提交之後釋放整個事務執行期間占用的事務資源。
反饋事務提交結果:
參與者在完成事務提交之後,向協調者傳送 ack 資訊。
完成事務:
協調者接收到所有參與者反饋的 ack 資訊後,完成事務。
中斷事務步驟如下:
假如任何乙個參與者向協調者反饋了no響應,或者在等待超時之後,協調者尚無法接收到所有參與者的反饋響應,那麼就會中斷事務
事務詢問
協調者向所有的參與者傳送事務內容,詢問是否可以執行事務提交操作,並開始等待各參與者的響應。
執行事務 (寫本地的undo/redo日誌)
各參與者向協調者反饋事務詢問的響應
總結: 各個參與者進行投票是否讓事務進行.
傳送回滾請求:
協調者向所有參與者發出 rollback 請求。
事務回滾:
參與者接收到 rollback 請求後,會利用其在階段一中記錄的 undo 資訊來執行事務回滾操作,並在完成回滾之後釋放在整個事務執行期間占用的資源。
反饋事務回滾結果:
參與者在完成事務回滾之後,向協調者傳送 ack 資訊。
中斷事務:
協調者接收到所有參與者反饋的 ack 資訊後,完成事務中斷。
從上面的邏輯可以看出,二階段提交就做了2個事情:投票,執行
2pc 優點缺點
優點
原理簡單,實現方便
缺點
同步阻塞,單點問題,資料不一致,過於保守
分布式理論:一致性協議 3pc
什麼是三階段提交
3pc,全稱 「three phase commit」,是 2pc 的改進版,將 2pc 的 「提交事務請求」 過程一分為二,共形成了由cancommit、precommit和docommit三個階段組成的事務處理協議
階段一:cancommit
階段二:precommit
協調者在得到所有參與者的響應之後,會根據結果有2種執行操作的情況:執行事務預提交,或者中斷事務
傳送預提交請求:
協調者向所有參與者節點發出precommit請求,並進入prepared階段
事務預提交:
參與者接收到precommit請求後,會執行事務操作,並將undo和redo資訊記錄到事務日誌中
各參與者向協調者反饋事務執行的結果:
若參與者成功執行了事務操作,那麼反饋ack
中斷事務:
無論是收到來自協調者的abort請求或者等待協調者請求過程中超時,參與者都會中斷事務
階段三 docommit
該階段做真正的事務提交或者完成事務回滾,所以就會出現兩種情況
分為2種情況
執行事務提交
傳送提交請求:
進入這一階段,假設協調者處於正常工作狀態,並且它接收到了來自所有參與者的ack響應,那麼他將從預提交狀態轉化為提交狀態,並向所有的參與者傳送docommit請求
事務提交:
參與者接收到docommit請求後,會正式執行事務提交操作,並在完成提交之後釋放整個事務執行過程中占用的事務資源
反饋事務提交結果:
參與者在完成事務提交後,向協調者傳送ack響應
完成事務:
協調者接收到所有參與者反饋的ack訊息後,完成事務
執行事務回滾
傳送中斷請求:協調者向所有的參與者節點傳送abort請求
事務回滾:參與者收到abort請求後,會根據記錄的undo資訊來執行事務回滾,並在完成回滾之後釋放整個事務執行期間占用的資源
反饋事務回滾結果:參與者在完成事務回滾後,向協調者傳送ack訊息。
中斷事務:協調者接收到所有參與者反饋的ack訊息後,中斷事務。
協調者出現問題
協調者和參與者之間的網路故障
如果出現了任一一種情況,最終都會導致參與者無法收到 docommit 請求或者 abort 請求,針對這種情況,參與者都會在等待超時之後,繼續進行事務提交
1.首先對於協調者和參與者都設定了超時機制(在2pc中,只有協調者擁有超時機制,即如果在一定時間內沒有收到參與者的訊息則預設失敗),主要是避免了參與者在長時間無法與協調者節點通訊(協調者掛掉了)的情況下,無法釋放資源的問題,因為參與者自身擁有超時機制會在超時後,自動進行本地commit從而進行釋放資源。而這種機制也側面降低了整個事務的阻塞時間和範圍。
2.通過cancommit、precommit、docommit三個階段的設計,相較於2pc而言,多設定了乙個緩衝階段保證了在最後提交階段之前各參與節點的狀態是一致的 。
3.precommit是乙個緩衝,保證了在最後提交階段之前各參與節點的狀態是一致的。
問題:3pc協議並沒有完全解決資料不一致問題。
分布式 分布式事務
是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...
分布式之分布式事務
被人問到分布式事務,之前學rabbitmq 的時候學到過rabbitmq 高階的事務,因為沒有用過,所有沒有回答好。這裡總結一下。1.單機版事務。事務的四大特性 acid a.原子性 b.一致性 c.隔離性 d.永續性 單機事務可以通過設定事務的隔離級別 參見spring 的事務隔離級別 2.分布式...
分布式事務 BASE 理論
部分總結出自參考資料 問題 下面我們將會了解 acid 的基礎上進行了解 base 理論 記得在學習 mysql 的時候最早接觸的就是acid,說的是資料庫事務操作中要滿足這四個方面 分別為 以下總結來自 非原創 base理論的核心思想是 即使無法做到強一致性,但每個應用都可以根據自身業務特點,採用...