事務 隔離級別 髒讀 不可重複 幻讀

2021-08-20 04:52:00 字數 3325 閱讀 4656

事務,就是一組運算元據庫的動作集合。

如果一組

處理步驟

全部發生或者一步也不執行,我們稱該組處理步驟為乙個事務。

當所有的步驟像乙個操作一樣被完整地執行,我們稱該事務被提交。

由於其中的一部分或多步執行失敗,導致沒有步驟被提交,則事務必須回滾到最初的系統狀態。

二、事務的併發問題

1、髒讀:事務

a讀取了事務b更新

、未提交

的資料,然後b回滾操作,那麼

a讀取到的資料是髒資料

(沒有用的資料

)2、不可重複讀:事務

a 多次讀取同一資料,

結果讀取的資料不一致,也就是說不支援重複讀,重複讀會有錯誤。

原因是事務 b 在事務

a多次讀取的過程中,對資料作了更新並提交,導致事務

a多次讀取同一資料不一致。

3、

幻讀:事務a讀取所有工資為

5000

的人數為

10人。此時,事務

b插入一條工資也為

5000

的記錄。這

時,事務a再次讀取工資為

5000

的員工,記錄為

11人。此時產生了幻讀。

需要表鎖才能隔離,所以大都數資料庫都

沒有將幻讀隔離。

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於

修改,幻讀側重於

新增或刪除

。解決不可重複讀的問題只需

鎖住滿足條件的行

,解決幻讀需要

鎖表三、mysql事務隔離級別

事務隔離級別

讀取速度

髒讀不可重複讀

幻讀含義

讀未提交(read-uncommitted

)效率高,

但是不用是是

是允許你讀取還未提交的改變了的資料。可能導致髒、幻、不可重複讀

不可重複讀

級別的(read-committed

)orcale

採用的級別否是

是允許在併發事務已經提交後讀取。可防止髒讀,但幻讀和 不可重複讀仍可發生

可重複讀(repeatable-read

)mysql

的級別否否是

對相同欄位的多次讀取是一致的,除非資料被事務本身改變。可防止髒、不可重複讀,但幻讀仍可能發生。

序列化(serializable

)隔離級別最高

安全,效率最低否否

否完全服從acid

的隔離級別,確保不發生髒、幻、不可重複讀。這在所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的資料表來完成的。

事務的隔離級別 ,是由資料庫提供的 ,並不是所有資料庫都支援四種隔離級別

mysql : read_uncommitted、

read_committed

、repeatable_read

、serializable (預設

repeatable_read

)oracle :

read_uncommitted

、read_committed

、 serializable

(預設

read_committed

)查詢當前級別 mysql>select @@tx_isolation

spring

五種隔離級別

第一種是預設的,isolation_default  使用資料庫預設的事務隔離級別.

另外四個與jdbc的隔離級別相對應;

第二種是isolation_read_uncommited, 會產生髒讀

, 不可重複讀

, 幻讀

第三種是isolation_read_commited, 可以防止髒讀

, 但是會發生不可重複讀和幻讀

第四種是isolation_repeatable_read, 可以防止髒讀和不可重複度

, 但是會產生幻讀

第五種是isolation_serializable,是

spring

事物的最高隔離級別

, 可以防止髒讀

,不可重複讀

, 幻讀的發生

, 但是這種隔離級別極大的犧牲了效能

.其中spring七個事物傳播屬性:

propagation_required -- 支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇。

propagation_supports -- 支援當前事務,如果當前沒有事務,就以非事務方式執行。

propagation_mandatory -- 支援當前事務,如果當前沒有事務,就丟擲異常。

propagation_requires_new -- 新建事務,如果當前存在事務,把當前事務掛起。

propagation_not_supported -- 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

propagation_never -- 以非事務方式執行,如果當前存在事務,則丟擲異常。

propagation_nested -- 如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,

則進行與propagation_required類似的操作。

補充:

1、

sql規範所規定的標準,不同的資料庫具體的實現可能會有些差異

2、

mysql

中預設事務隔離級別是可重複讀時並不會鎖住讀取到的行

3、事務隔離級別為讀提交時,寫資料只會鎖住相應的行

4、事務隔離級別為可重複讀時,如果有索引(包括主鍵索引)的時候,以索引列為條件更新資料,會存在間隙鎖間隙鎖、行鎖、下一鍵鎖的問題,從而鎖住一些行;如果沒有索引,更新資料時會鎖住整張表。

5、事務隔離級別為序列化時,讀寫資料都會鎖住整張表

6、隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大,魚和熊掌不可兼得啊。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為

read committed

,它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

事務隔離級別與髒讀 幻讀 不可重複讀

我們知道,事務的四大特性是a 原子性 c 一致性 i 隔離性 d 永續性 事務隔離級別就是為了滿足隔離性的機制。在併發場景下,如果沒有一定的處理方式,就會出現髒讀 幻讀 不可重複讀三類問題。髒讀 事務a在執行過程中,修改了某資料,事務b讀取了修改後的資料,然後事務a進行了回滾操作,這個時候事務b讀取...

事務隔離級別 髒讀 不可重複讀 幻讀 介紹

事務是現代關係型資料庫的核心之一。在多個事務併發運算元據庫 多執行緒 網路併發等 的時候,如果沒有有效的避免機制,就會出現以下幾種問題 a事務執行過程中,b事務讀取了a事務的修改。但是由於某些原因,a事務可能沒有完成提交,發生rollback了操作,則b事務所讀取的資料就會是不正確的。這個未提交資料...

髒讀 幻讀和不可重複讀 事務隔離級別

1.髒讀 髒讀就是指當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。e.g.1.mary的原工資為1000,財務人員將mary的工資改為了8000 但未提交事務 2.mary讀取自己的工資 發現自己的工資變為了800...