概述
有點像操作系統啊
原子性、一致性、隔離性和持久性
一、原子性(atomicity)
一個事務要麼全部提交成功,要麼全部失敗回滾,不能只執行其中的一部分操作,這就是事務的原子性
二、一致性(consistency)
事務的執行不能破壞數據庫數據的完整性和一致性,一個事務在執行之前和執行之後,數據庫都必須處於一致性狀態。
如果數據庫系統在運行過程中發生故障,有些事務尚未完成就被迫中斷,這些未完成的事務對數據庫所作的修改有一部分已寫入物理數據庫,這是數據庫就處於一種不正確的狀態,也就是不一致的狀態
三、隔離性(isolation)
事務的隔離性是指在併發環境中,併發的事務時相互隔離的,一個事務的執行不能不被其他事務干擾。不同的事務併發操作相同的數據時,每個事務都有各自完成的數據空間,即一個事務內部的操作及使用的數據對其他併發事務時隔離的,併發執行的各個事務之間不能相互干擾。
在標準SQL規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同,分別是:未授權讀取,授權讀取,可重複讀取和串行化
1、讀未提交(Read Uncommited),該隔離級別允許髒讀取,其隔離級別最低;比如事務A和事務B同時進行,事務A在整個執行階段,會將某數據的值從1開始一直加到10,然後進行事務提交,此時,事務B能夠看到這個數據項在事務A操作過程中的所有中間值(如1變成2,2變成3等),而對這一系列的中間值的讀取就是未授權讀取
2、授權讀取也稱爲已提交讀(Read Commited),授權讀取只允許獲取已經提交的數據。比如事務A和事務B同時進行,事務A進行+1操作,此時,事務B無法看到這個數據項在事務A操作過程中的所有中間值,只能看到最終的10。另外,如果說有一個事務C,和事務A進行非常類似的操作,只是事務C是將數據項從10加到20,此時事務B也同樣可以讀取到20,即授權讀取允許不可重複讀取。
3、可重複讀(Repeatable Read)
就是保證在事務處理過程中,多次讀取同一個數據時,其值都和事務開始時刻是一致的,因此該事務級別禁止不可重複讀取和髒讀取,但是有可能出現幻影數據。所謂幻影數據,就是指同樣的事務操作,在前後兩個時間段內執行對同一個數據項的讀取,可能出現不一致的結果。在上面的例子中,可重複讀取隔離級別能夠保證事務B在第一次事務操作過程中,始終對數據項讀取到1,但是在下一次事務操作中,即使事務B(注意,事務名字雖然相同,但是指的是另一個事務操作)採用同樣的查詢方式,就可能讀取到10或20;
4、串行化
是最嚴格的事務隔離級別,它要求所有事務被串行執行,即事務只能一個接一個的進行處理,不能併發執行。
四、持久性(durability)
一旦事務提交,那麼它對數據庫中的對應數據的狀態的變更就會永久保存到數據庫中。--即使發生系統崩潰或機器宕機等故障,只要數據庫能夠重新啓動,那麼一定能夠將其恢復到事務成功結束的狀態
1.丟失修改
發生在兩個寫
2.不可重複讀
一個讀,一個更新數據庫對象
幻讀
幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,比如這種修改涉及到表中的“全部數據行”。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入“一行新數據”。那麼,以後就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣.一般解決幻讀的方法是增加範圍鎖RangeS,鎖定檢鎖範圍爲只讀,這樣就避免了幻讀。
3.讀髒數據
數據庫的中間狀態
封鎖以及封鎖協議
基本封鎖類型
排它鎖 X,
共享鎖,S,T只能讀A不能改A
---------------------------------------------------------------------
何時申請、持續時間、何時釋放
-----------------------------------------------------------------------------------
一級封鎖協議:修改數據前必須先對加鎖X,防止丟失修改;但是僅僅讀的話,不加鎖,不能保證可重複讀和不讀髒數據
二級封鎖協議:修改數據前加X,讀的時候加S,S是讀完就釋放。可以防止讀髒數據
過程中需要結合相容矩陣
三級封鎖協議:S鎖也是直到事務結束才釋放。
活鎖和死鎖
活鎖:活着就是思而不得,輾轉反側。
解決:先來先服務
----------------------------------------------
死鎖:
兩類方法
1、死鎖的預防
死等對方,
(1)一次封鎖法,把所有要用到的都加鎖;咋能直接獲得要封鎖的呢?太難了
(2)順序封鎖法,規定封鎖順序;封鎖序列也是資源啊,能本也不少
2、死鎖的診斷與解除
(1)超時法
(2)等待圖法
---------------------------------------------------------------
解除死鎖:
選擇一個處理死鎖代價最小的撤銷
可串行化調度與衝突可串行化調度
讀沒事,寫不同也沒有事
兩段鎖協議
是可串行化的充分條件。
封鎖的粒度
自己加鎖會對上架有影響
--------------------------------------------------------------------
意向鎖:
就是加基本鎖之前先給前面的祖先加意向鎖