事務指滿足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...