資料庫事務的四種隔離級別(小白向)

2021-10-07 15:48:26 字數 2923 閱讀 9209

讀鎖也稱共享鎖(記為s,即shared-mode lock),寫鎖也稱排它鎖(記為x,即exclusive-mode lock)。每個事務對於乙個資料項的操作型別要申請適當的鎖。

相容:讀鎖和讀鎖相容,即同乙個資料項可以同時被多個事務申請讀鎖。但是讀鎖和寫鎖、寫鎖和寫鎖不相容,即如果乙個資料項已經被申請了讀鎖,那它就不能再被申請寫鎖。

關於寫鎖的處理:

寫時加寫鎖(update給更新的行加寫鎖,insert給新插入的行加寫鎖),事務結束時放寫鎖。

關於讀鎖的處理:

可序列化serializable

執行順序只能以事務為單位執行(而不能以語句為單位執行),並行化最低,效率最差,但安全性最高。可以避免髒讀、不可重複讀、幻讀。

可重複讀repeatable read

讀時加讀鎖,事務結束時放讀鎖。可以避免髒讀、不可重複讀,但會出現幻讀。

已提交讀read committed

讀時加讀鎖,讀完放讀鎖。可以避免髒讀,但會出現不可重複讀和幻讀。

未提交讀read uncommitted

讀時不加讀鎖。會出現髒讀、不可重複讀和幻讀。

四種隔離級別只是針對讀而言的(select),所以宣告乙個只有寫操作的事務的隔離級別沒有什麼意義。

髒讀:讀取到了未提交的修改資料。

設有關係模型r(a,b),最開始有乙個元組(1,2),有兩個事務:t1,t2(省略掉開頭和結尾的begin transaction和end transaction):

t1:update r set a=a*2

commit

t2:select max(a) from t1

我們不關心t1的隔離級別(因為t1只執行寫操作,而隔離級別是針對讀而言的),

如果t2執行於隔離級別read uncommitted,當t1還未提交但已經update的時候,t2會讀出max(a)=2,但是如果因為種種原因導致t1回滾,那麼資料庫就不會發生改變,t2讀出的2就是乙個「髒資料」,所以稱為髒讀。

不可重複讀:乙個事務中重複讀同乙個資料出來的值是不同的。

設有兩個university資料庫的事務t1,t2:(s1,s2,s3都是語句,s1包括了commit)

t1:s1:update student set gpa=gpa*2

commit

t2:s2:select max(gpa) from student

s3:select max(gpa) from student

如果t2執行於隔離級別read commited,執行順序可以是s2-s1-s3,因為s2讀時加讀鎖,讀完釋放,然後s1可以給所有資料項加寫鎖,然後t1結束時釋放,最後是s3。按這種順序執行,讀出來的結果是不同的,即不可重複讀。

但如果t2執行於隔離級別repeatable read,執行順序就不能使s2-s1-s3了,因為s2讀時加讀鎖,t2結束時才釋放,那麼s1就無法得到寫鎖(因為所有資料項已經被加上了讀鎖)。所以repeatable read可以避免在兩次讀之間的更新使得讀同乙個值的結果不同。

幻讀:在兩個讀之間有insert,就會有幻影元組(phantom tuples)出現,導致讀同乙個值的結果不同。

還是university資料庫的兩個事務t1,t2:

t1:s1:insert into [100 new tuples]

t2:s2:select max(gpa) from student

s3:select max(gpa) from student

執行順序可以是s2-s1-s3,因為s2只是給當前所有的項加讀鎖,而s1是插入新的資料項並加寫鎖,兩者並不衝突,然後t1結束後釋放新加的100個元組的寫鎖,s3就可以執行。結果是出現了100個幻影元組insert導致重複讀同乙個值的結果不同

表sell(bar,beer,price),最開始sell有2個元組(『joe』s bar,qingdao,20),(『jackson』s bar,guinness,50)。有兩個事務t1,t2:(s1~s4表示語句)

t1:s1:insert into sell values(『joe』s bar,heinesen,60)

s2:update sell set price=price+10

commit

t2:s3:select max(price) as p1 from sell

s4:select min(price) as p2 from sell

已知隔離級別:t1是serializable,t2是repeatable read,求t2的執行結果。

解答:

不用關心t1的隔離級別,直接看t2:讀時加讀鎖,事務結束時釋放。

s2不能出現在s3和s4之間,因為s3執行會給所有行加讀鎖,然後s2會無法執行。

s1也不能出現在s3和s4之間,因為若s1在s3和s4之間,s2就只能在s4後面,順序是s3-s1-s4-s2,s3給原來2行加讀鎖,s1給新加入一行加寫鎖,s4就不能加讀鎖(即不能執行)。

所以執行順序只能是t1-t2或者t2-t1。

資料庫事務四種隔離級別

定義 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。資料庫事務的隔離級別有4個,由低到高依次為read uncommitted 未授權讀取 讀未提交 read committed 授權讀取 讀提交 repeatable read 可重複讀取 serializable 序列化 ...

資料庫事務四種隔離級別

定義 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。資料庫事務的隔離級別有4個,由低到高依次為read uncommitted 未授權讀取 讀未提交 read committed 授權讀取 讀提交 repeatable read 可重複讀取 serializable 序列化 ...

資料庫事務四種隔離級別

定義 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。資料庫事務的隔離級別有4個,由低到高依次為read uncommitted 未授權讀取 讀未提交 read committed 授權讀取 讀提交 repeatable read 可重複讀取 serializable 序列化 ...