資料庫底層 事務

2021-09-29 03:33:43 字數 2306 閱讀 9884

事務指滿足acid特性的一組操作,可以通過commit提交,rollback回滾

一.acid

1.atomicity原子性

事務是不可分割的最小單元,事務的所有操作要麼全部提交成功,要麼全部失敗回滾。

回滾時根據日誌反向操作

2.consistency一致性

事務執行前後保持一致性狀態,所有事務對乙個資料的讀取結果都是相同的。

例如:轉賬前a賬戶有3000,b賬戶有2000,無論怎麼轉,a+b賬戶都只有5000

3.isolation隔性

乙個事務所做的修改在最終提交之前,對其他事務是不可見的

4.durability永續性

一旦事務提交,則所做的修改會永遠儲存到資料庫中。使用日誌來保證永續性,應對資料庫崩潰

acid的關係:

1.滿足了一致性,事務的執行結果才是正確的

2.無併發時,事務序列執行,滿足隔離性,此時只要滿足原子性就能保證一致性

3.有併發時,事務並行執行,事務要同時滿足原子性和隔離型才能保證一致性

4.永續性是為了應對資料庫崩潰的情況

二.隔離性引發的問題

併發環境下,事務的隔離性難以保證,會引發一致性的問題

1.丟失修改:a的修改被b覆蓋

2.髒讀:b讀取到了a修改的資料,但是a撤銷了這次修改,b讀到的就是髒資料

3.不可重複讀:a兩次分別讀到了b修改前後的同乙個資料,讀到了兩個結果

4.虛讀(幻讀):a讀取某個範圍的資料(count),b在這個範圍內插入新資料,a再讀時的結果就不一樣了

通過鎖來保護隔離性。鎖不用使用者控制,資料庫提供了事務的隔離級別

三.鎖mysql中提供了兩種鎖的粒度:行級鎖和表級鎖

選擇鎖的粒度要權衡鎖開銷和併發程度

1.鎖型別

1)讀寫鎖:

寫鎖——x鎖

讀鎖——s鎖

乙個事務對資料物件 a 加了 x 鎖,就可以對 a 進行讀取和更新。加鎖期間其它事務不能對 a 加任何鎖。

乙個事務對資料物件 a 加了 s 鎖,可以對 a 進行讀取操作,但是不能進行更新操作。加鎖期間其它事務能對 a 加 s 鎖,但是不能加 x 鎖。

2)意向鎖:

意向鎖在原來的 x/s 鎖之上引入了 ix/is,ix/is 都是表鎖,用來表示乙個事務想要在表中的某個資料行上加 x 鎖或 s 鎖。有以下兩個規定:

乙個事務在獲得某個資料行物件的 s 鎖之前,必須先獲得表的 is 鎖或者更強的鎖;

乙個事務在獲得某個資料行物件的 x 鎖之前,必須先獲得表的 ix 鎖。

通過引入意向鎖,事務 t 想要對錶 a 加 x 鎖,只需要先檢測是否有其它事務對錶 a 加了 x/ix/s/is 鎖,如果加了就表示有其它事務正在使用這個表或者表中某一行的鎖,因此事務 t 加 x 鎖失敗。

2.**鎖協議解決隔離性引發的問題:

1)一級鎖協議:事務t要修改資料a時必須要加x鎖,t結束時才釋放鎖

可以解決丟失修改的問題,乙個沒寫完之前另乙個只能等

2)二級鎖協議:在一級的基礎上,再要求讀取資料a時必須加s鎖,讀取完後馬上釋放s鎖

可以解決髒讀(讀未提交)的問題,因為乙個事務在寫的時候加了x鎖,而加了x鎖期間不能再加任何鎖,

在加s鎖的時候肯定是釋放了x鎖(寫完畢),所以不會讀到未提交的資料。

3)**鎖協議:在二級的基礎上,要求讀取a時必須加s鎖,事務結束了才能釋放s鎖

二級是讀取完了就釋放s鎖,這個是事務結束了才釋放s鎖,因此解決了不可重複讀的問題。

3.兩段鎖協議:加鎖和解鎖分為兩個階段進行

可序列化排程:通過併發控制,使併發執行的事務結果看起來像序列執行的事務

兩段鎖協議是保證可序列化的充分條件

mysql的innodb引擎採用兩段鎖協議

四.事務隔離級別

1.未提交讀

事務中的修改,即使沒有提交,也對其他事務可見
2.提交讀

乙個事務只能讀取已經提交的事務所做的修改,即在修改的事務對其他事務不可見(二級鎖協議)
3.可重複讀

保證乙個事務多次讀取同樣的結果是一樣的(**鎖協議)
4.可序列化

強制事務序列執行
五.總結

1.事務是一次操作的最小單位——>事務的四個特性:a原子性,c一致性,i隔離性,d永續性——>四個特性的關係

2.事務的隔離性引發的問題:丟失修改,髒讀,不可重複度,虛讀——>引入鎖解決隔離性的問題——>讀寫鎖,意向鎖——>

引入鎖協議:**鎖協議與兩段鎖協;對應事務的隔離級別:即讀未提交,讀已提交,可重複讀,序列化

摘自:

資料庫事務特性底層實現原理

事務的四大特性 acid 1.原子性 atomicity 乙個事務必須視為乙個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於乙個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性。2.一致性 consistency 資料庫總數從乙個一致性的狀態轉換到另乙...

Oracle資料庫底層

oracle底層的架構對編寫出高效能的sql語句非常重要 例項系統全域性記憶體區域性區域 sga 和一系列的後台程序組成 pga sga的兩個領域 共享池和資料庫資料緩衝 sga共享池 地位 關鍵部分之一 作用 oracle快取程式資料的地方 庫快取記憶體 儲存sql語句的地方,儲存已經解析的語句的...

資料庫事務

事件是訪問並可能更新各種資料項的乙個程式執行單元。事件由事務開始與事務結束之間執行的全體操作組成。為了保證資料完整性,資料庫系統需要維護事務的以下性質 原子性 atomicity 事務中的操作要麼全部成功,要麼全部失敗。一致性 consistency 事務執行前後要保持資料庫的一致性。隔離性 iso...