資料庫隔離級別

2021-08-15 09:34:11 字數 1207 閱讀 8458

一、資料庫的隔離級別由低到高:read uncommitted(讀未提交),read committed

(讀已提交),repeatable read(可重複讀),serializable

(序列化),這四種隔離級別為解決髒讀,不可重複讀,幻讀。

注意:這裡所提到的隔離級別場景,是

針對多事務併發的情況

;二、髒讀、不可重複讀、幻讀

髒讀:乙個事務在讀取過程中,讀取了另一事務操作的未提交資料;

不可重複讀:乙個事務前後讀取相同資料結果時,另一事務處理了這裡面的資料(這裡的處理指update和delete),並且已經提交了。導致第乙個事務前後讀取的資料結果不一樣。(即乙個事務中在多次相同查詢且當前事務不操作這些資料時,查詢結果應該相同,不受其他事務操作這些資料影響);

幻讀:當乙個事務先修改一批或者檢視一批資料時,另一事務新增了一條在這修改和檢視的資料條件內的資料,這時第乙個事務就會丟失對第二個事務新增的資料。

三、不可重複讀和幻讀的區別

不可重複讀和幻讀有些相似,容易混淆,各區別:不可重複讀重點update 和delete ,幻讀重點在於insert

如果使用鎖機制來實現這兩種隔離級別,在可重複讀中,該sql第一次讀取到資料後,就將這些資料加鎖,其它事務無法修改這些資料,就可以實現可重複 讀了。但這種方法卻無法鎖住insert的資料,所以當事務a先前讀取了資料,或者修改了全部資料,事務b還是可以insert資料提交,這時事務a就會 發現莫名其妙多了一條之前沒有的資料,這就是幻讀,不能通過行鎖來避免。需要serializable隔離級別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這麼做可以有效的避免幻讀、不可重複讀、髒讀等問題,但會極大的降低資料庫的併發能力。

四、隔離級別

(1)read uncommitted(讀未提交):導致髒讀

(2)read committed

(讀已提交):避免髒讀,允許不可重複讀和幻讀

(3)repeatable read(可重複讀):避免髒讀和不可重複讀,允許幻讀

(4)serializable

(序列化):避免髒讀和不可重複讀和幻讀

總結:隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越來越大。

大多數的資料庫預設隔離級別為:read committed(讀已提交),例如:sqlserver、oracle。

少數資料庫預設隔離級別為:

repeatable read(可重複讀),比如mysql 、innodb

資料庫隔離級別

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...