基本內容:acid與cap、資料庫事務可能引發的問題、資料庫鎖的型別、**封鎖協議、兩段鎖協議、資料庫隔離級別、mvcc的實現步驟、mysql事務如何實現、資料庫鎖如何實現、xa兩段提交協議。
1.acid是資料庫事務正確執行的四個基本要素:
原子性:事務是資料庫併發控制的最小單位,要麼全部提交成功,要麼全部回滾失敗;
一致性:事務執行前後,資料的完整性必須保證一致。事務執行前後都保持一致性,資料庫總是由乙個一致性狀態轉向另乙個一致性狀態。
隔離性:乙個事務的修改在最終提交之前,對其它事務是不可見的;
永續性:事務一旦提交,其所做的修改將永遠儲存在資料庫中。即使系統發生崩潰,事務執行的結果也不能丟失。可以通過資料庫備份和恢復來保證永續性。
2.cap是分布式系統的設計原則。
一致性:在乙個時刻,各節點資料是否相同。強一致性:資料一致更新,所有的資料變動都是同步的;弱一致性:在限定時間內,最終達到一致。
可用性:集群對外好的響應效能;有限時間內返回結果。乙個結點宕機不影響整體。
分割槽容錯性:系統如果不能在時限內達成資料一致性,就意味著發生了分割槽的情況,就必須在c和a之間做出選擇。
3.併發一致性
在併發環境下,乙個事務如果受到其它事務的影響,那麼事務操作就無法滿足一致性條件。可能引發的問題有:
(a)丟失修改。t1和t2兩個事務都對乙個資料進行修改,t1先修改,t2隨後修改,則t2的修改覆蓋了t1的修改。
(b)髒讀。t1修改乙個資料,t2隨後讀取這個資料。如果t1撤銷了這次修改,那麼t2讀取的資料是髒資料
(c)不可重複讀。t1讀取乙個資料,t2對該資料進行了修改。如果t1在讀這個資料,此時讀取的結果和第一次讀取的結果不同。
(d)幻讀(廣義的不可重複讀)。t1讀取某個範圍內的資料集,若t2在該範圍內插入了一條資料。如果t1再讀取該範圍的資料,此時讀取的結果和第一次讀取的結果不同。
解決方法:
產生併發不一致性的主要問題是破壞了事務的隔離性,解決方法是通過併發控制(封鎖)來保證隔離性。
4.封鎖
(a)鎖型別
排它鎖(exclusive),簡稱為x鎖,又稱寫鎖。乙個事務t對資料物件a加了x鎖,就可以對a進行讀取和更新。加鎖期間其它事務不能對a加任何鎖。
共享鎖(shared),簡稱為s鎖,又稱讀鎖。乙個事務t對資料物件a加了s鎖,就可以對a進行讀取操作,但是不能進行更新操作。加鎖期間其它事務能對a加s鎖,但是不能加x鎖。
更新鎖(updated),簡稱為u鎖。在提交讀隔離級別中,此事務讀取資料[獲取資料物件的讀鎖(s鎖)],然後修改資料 [此操作要求鎖轉換為排他鎖(x 鎖)],併發時可能導致死鎖。因此引入u鎖。
update test set a=a-1 where id=1;//不恰當的例子 該更新語句分為兩步:先讀資料物件的值,再設定資料物件的值。
意向鎖(intention locks)可以支援多粒度封鎖。它本身是乙個表鎖,表示想對該錶的某行記錄進行操作,而非整張表。通過原來的x/s鎖之上引入了ix/is,來表示乙個事務想要在某個資料行上加x鎖或s鎖。
(b)封鎖粒度
鎖資料庫、表、頁、行、屬性列。
(c)封鎖協議
**封鎖協議:通過加不同型別的鎖和不同的釋放時機來實現。
1級封鎖協議:事務t要修改資料物件a時必須加x鎖,直到事務結束才釋放鎖。可以有效避免修改丟失問題。
2級封鎖協議:在1級封鎖協議的基礎上,約定讀取a時必須加s鎖,讀取完馬上釋放s鎖。可以有效避免髒讀問題。根據1級封鎖協議,若t事物1在對資料物件a進行修改,會加x鎖,那麼事務t2就無法對a加s鎖,也就不會讀入髒資料。
3級封鎖協議:在1級封鎖協議的基礎上,約定讀取a時必須加s鎖,直至事務結束了才釋放s鎖。可以有效避免不可重複讀問題。因為事務在讀a時,其它事務不能加x鎖,從而避免了在讀期間資料發生改變。
兩段鎖協議:事務t對資料物件a進行讀或寫操作之前,必須先獲得對a的封鎖;並且在釋放乙個封鎖後,t就不能再獲得其它任何鎖。「兩段」鎖顧名思義即把事務分為兩個階段:加鎖階段和釋放鎖階段。
事務遵循兩段鎖協議是可序列化排程的充分條件。例如以下操作滿足兩段鎖協議,它是可序列化排程的。
lock-x(a)...lock-s(b)...lock-s(c)...unlock(a)...unlock(c)...unlock(b)
但不是必要條件,例如以下操作不滿足兩段鎖協議,但它還是可序列化排程的。
lock-x(a)...unlock(a)...lock-s(b)...unlock(b)...lock-s(c)...unlock(c)...
(d)資料庫隔離級別(隔離性)
1.未提交讀(read uncommitted)
指定語句可以讀取已由其它事務修改但尚未提交的行。事務中的修改,即使沒有提交,對其它事務也是可見的。
2.提交讀(read committed)
指定語句不能讀取已由其它事務修改但尚未提交的行。這樣可以避免髒讀。該選項是sql server預設隔離級別。乙個事務只能讀取已經提交事務所做的修改。換句話說,乙個事務所做的修改在提交之前對其它事務是不可見的。
3.可重複讀(repeatable read)
指定語句不能讀取已由其它事務修改但尚未提交的行,並且指定,其它任何事務都不能在當前事務提交之前修改由當前事務讀取的資料。該選項是mysql預設隔離級別。可以保證在同乙個事務中多次讀取同樣的資料的結果是一樣的。不能解決幻讀。
4.可序列化(serialixable)
強制事務序列執行,就不存在併發問題。
5.多版本併發控制(multi-version concurrency control,mvcc)/snapshot隔離級別
思想: copyonwrite,無鎖程式設計。 適用於讀多寫少的場景(寫時複製)。
實現原理:預設新增兩個隱藏列(資料建立時間事務版本號create_ver,資料刪除時間事務版本號expire_ver),通過對兩個隱藏列的對比實現。
(1)select:行建立版本號create_ver<=當前事務版本號current_ver(代表該事務開啟之前資料行就存在或者是當前事務新建的資料行)且行刪除版本號expire_ver>當前事務版本號current_ver(代表事務開始前該行還沒有被刪除)。
(2)update:寫時複製機制。將舊行刪除時間expire_ver設為當前事務版本號current_ver:expire_ver=current_ver;將新行的建立時間create_ver設定為當前事務版本號create_ver=current_ver;
(3)delete:將刪除時間設為當前事務版本號expire_ver=current_ver;
(4)insert: 將建立時間設為當前事務版本號expire_ver=current_ver;
mysql事務的實現:
通過鎖實現隔離性,通過redo log來實現原子性和永續性,通過undo log來實現一致性。
xa兩段提交協議:
兩類角色:協調者、參與者。協調者是對集群的事務進行控制,本身不需要執行事務。
階段1:事務請求(詢問)階段。1.協調者向所有參與者傳送事務內容,並等待各參與者回應是否可以進行事務提交操作;2.各參與者開始執行事務,並將自己的執**況反饋給協調者,如果可以進行事務提交操作,則返回yes,否則返回no。
階段2:事務提交階段。如果協調者從所有參與者都獲得yes響應,則對所有參與者傳送commit命令;參與者接受到commit命令後執行事務提交操作,在提交事務完成後向釋放占用資源並協調者傳送ack訊息;協調者接受到所有參與者的ack後,該事務完成。如果任何乙個協調者向參與者傳送了no響應,或者在超時時間內協調者沒有收到所有參與者的回饋響應,那麼會中斷事務:協調者向所有參與者傳送rollback命令,參與者接收到rollback命令後,開始執行回滾操作,回滾完成後釋放等占用資源並向協調者傳送ack訊息,協調者接受到所有參與者的ack後再執行事務中斷。
可以看出這是乙個強一致性演算法。
問題:1.事務提交階段存在同步阻塞,所有參與者等待協調者的commit/rollback命令才能繼續執行,極大地限制了分布式系統的效能。2.協調者單點故障,若在第二階段協調者掛掉而沒有傳送,沒有向參與者傳送commit/rollback命名,那麼所有參與者將持續等待,無法完完成提交事務;或者只向部分參與者傳送了commit就掛掉了,那麼將導致資料不一致性,出現資料分割槽。
參:mysql技術內幕
資料庫原理
資料庫是乙個以某種有組織的方式儲存的資料集合。也就是 儲存有組織資料的容器 乙個檔案或一組檔案 儲存資料的工具,或者說是儲存資料的集合,結構為 模式 內模式 外模式,由dbms 資料庫作業系統 來控制,達到管理資料的目的 特點 兩大資料模型 注 關係與非關聯式資料庫 資料庫三層次 我們要將資料存放到...
資料庫原理
資料建模分類 對資料建模的模型分類,分為以下兩大類 概念模型 又叫資訊模型 按照使用者觀點對現實世界資料進行建模 例如 實體 聯絡模型 e r模型 資料模型 按照計算機系統的觀點對現實世界資料進行建模 例如 關係模型 資料模型三要素 資料結構 資料操作 資料的完整性約束條件 對 的補充 資料的完整性...
資料庫 資料庫索引原理
正確的建立合適的索引 是提公升資料庫查詢效能的基礎 4.b tree 在兩大引擎中的體現 5.索引的原則 索引是為了加速對錶中資料行的檢索而建立的一種分散儲存的資料結構。索引能極大的減少儲存引擎需要掃瞄的資料量 索引可以把隨機io變成順序io 索引可以幫助我們在進行分組 排序等操作時,避免使 用臨時...