1. 程式人生 > >面試篇之對資料庫事務隔離級別的理解

面試篇之對資料庫事務隔離級別的理解

所謂資料庫隔離級別,就是為了解決兩個或多個事務之間操作同一個資料庫物件是出現的衝突問題。對資料的操作無非是讀寫,事務隔離級別也主要是在事務的讀寫之間進行隔離。
首先列一下4種隔離級別:
1.read uncommited(可讀未提交的)
2.read commited(提交了才能讀)
3.repeatable read(可重複讀)
4.serializable(序列化讀寫)

先從簡單說起吧,serializable無非是最嚴格的,不官你是讀還是寫,必須排隊一個個來,所以這個隔離級別不會出現髒讀幻讀之類的問題,每個事務操作的都是完完全全屬於自己的資料,不會有其他事務和你掙。但是可想而知這種級別也是效率最低的,很少場景會使用這種隔離級別。

read uncommited可讀取未提交的資料,就是我在寫的時候你順便讀,我在資料庫寫你讀到的就是什麼,但這時候寫的事務並沒有提交,所以讀到的是髒資料。一版資料庫預設都是使用這個事務隔離級別。

read commited 比read uncommit級別更高一點,我寫的時候,你是不能讀的,只有我提交了你才能讀,這種級別偏向於寫,可以理解成寫的地位更高,讀的都的往後排。這樣避免了髒讀的問題,但是會有這樣一種情況,假設我需要讀兩遍資料庫,我第一次讀到資料,好,這個時候你開始寫的事務,因為你地位高我就等你寫完再讀,這下可想而知資料被改了,在讀的時候與第一次讀到的資料就不一樣了,這個就叫幻讀。

幻讀是兩次讀到的資料不一致,與髒讀表象是一樣的。但是區別於髒讀,髒讀讀到的資料是寫事務還未提交的資料,而幻讀是寫事務已提交了資料。只是前後兩次讀到的不一致,感覺像產生幻覺一樣。

那怎麼解決幻讀這個問題呢,很明顯我們會想到把讀的地位提高,我要讀兩次你就得等我兩次讀完你才能寫,這就是repeatable read 可重複讀,讀的事務開始了,愛怎麼讀怎麼讀,寫給我靠邊站,這樣就不會出現幻讀,這種級別比read commited又高了一級。

這就是資料庫的4種隔離級別。