資料庫的隔離級別

2021-07-11 18:28:57 字數 1626 閱讀 9830

定義:

在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted(未授權讀取、讀未提交)、read committed(授權讀取、讀提交)、repeatable read(可重複讀取)、serializable(序列化),這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。

問題的提出:

之所以提出事務隔離級別,是因為在乙個事務執行過程中,可能會出現以下幾種情況:

1、更新丟失

兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。

2、髒讀

乙個事務讀取到了另乙個事務未提交的資料操作結果。

3、不可重複讀(non-repeatable reads):乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的結果。

包括以下情況:

(1)虛讀:事務t1讀取某一資料後,事務t2對其做了修改,當事務t1再次讀該資料時得到與前一次不同的值。

(2)幻讀(phantom reads):事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的資料或者缺少了第一次查詢中出現的資料(這裡並不要求兩次查詢的sql語句相同)。這是因為在兩次查詢過程中有另外乙個事務插入資料造成的。

下面介紹一下這幾種事務隔離級別的區別以及可能出現的問題:

read uncommitted(未授權讀取、讀未提交):

直譯就是"讀未提交",意思就是即使乙個更新語句沒有提交,但是別 

的事務可以讀到這個改變.這是很不安全的.避免了更新丟失,卻可能出現髒讀

read committed(授權讀取、讀提交):

直譯就是"讀提交",意思就是語句提交以後即執行了commit以後 

別的事務就能讀到這個改變.該隔離級別避免了髒讀,但是卻可能出現不可重複讀。

repeatable read(可重複讀取):

直譯就是"可以重複讀",這是說在同乙個事務裡面先後執行同乙個 

查詢語句的時候,得到的結果是一樣的.避免了不可重複讀取和髒讀,但是有時可能出現幻讀

serializable(序列化):

直譯就是"序列化",意思是說這個事務執行的時候不允許別的事務 

併發執行.不僅可以避免髒讀、不可重複讀,還避免了幻像讀。

隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed。它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

大多數資料庫的預設級別就是read committed,比如sql server , oracle。

mysql的預設隔離級別就是repeatable read。

資料庫隔離級別

read uncommited 讀未提交 最低級別,可讀取未提交事物的資料,這會導致髒讀,比如 某時刻會話a修改了乙個資料,但還未提交,此時會話b,讀取了該資料,這是,會話a回滾了事物,這就導致資料出現了不一致狀態,這就是髒讀 read commited 提交讀 避免了髒讀,但會導致不可重複讀,例如...

資料庫隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀 不可重複讀 幻讀read uncommitted re...

資料庫隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...