資料庫的隔離級別

2021-07-11 02:18:01 字數 1093 閱讀 5516

隔離級別

在資料庫操作中,為了有效的保證併發讀取資料的正確性而提出的

<1>更新丟失:兩個事務同時更新一條資料,但第二個事務卻中途退出(失效),導致對資料的兩個修改都失效了,這是因為系統沒有執行任何的鎖操作,而併發事件未被隔離開

<2>髒讀:兩個併發的事務,事務b讀取了事務a未提交的資料

<3>不可重複讀:兩個併發的事務,事務a讀取了事務b的資料,事務b更新了資料,並進行了提交,當事務a再次讀取事務b時,資料會不一樣

1.讀未提交( read uncommitted) —產生髒讀,可以通過排它鎖實現

(如果乙個事務已經開始寫資料,則不允許同時寫資料,但允許其他事務讀資料)

2.讀已提交(read committed)—避免了髒讀,產生不可重複讀問題,可通過瞬間共享讀鎖和排它鎖可實現

(讀資料的事務允許其他事務繼續訪問該行資料,但未提交的資料會禁止)

3.重複讀(repeatable read)—避免不可重複讀,產生幻讀,可通過共享讀鎖和排他鎖可實現

(讀取資料的事務會禁止寫事務,寫事務則禁止任何其他事務)

4.序列化(serializable)—最高的事務隔離級別,同時代價也花費最高,效能很低,一般很少使用,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。

(如果僅通過行級鎖是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被執行查詢操作的事務訪問到)

隔離級別越高,越能保證資料的完整性和一致性,但是對併發性的影響也越大,對於多數的應用程式來說,可以優先考把資料庫系統的隔離級別設為讀提交,它能夠避免髒讀,而且具有較好的併發效能,儘管它會導致不可重複讀,虛讀等一些併發性問題,但可以由應用程式採用悲觀鎖和樂觀鎖來控制

*oracle 支援的 2 種事務隔離級別:read commited, serializable. oracle 預設的事務隔離級別為: read commited

mysql 支援 4 中事務隔離級別. 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...