事務隔離級別總結

2022-05-23 01:57:08 字數 2782 閱讀 6259

一、事務隔離級別

在資料庫系統中,隔離是定義乙個操作對資料所做的改變如何/何時對其它的並行操作可見。  

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

事務隔離級別:乙個事務對資料庫的修改與並行的另乙個事務的隔離程度。  

二、事務併發執行涉及到的問題

資料庫是要被廣大客戶所共享訪問的,那麼在資料庫操作過程中很可能出現以下幾種不確定情況:

髒讀(drity read):某個事務已更新乙份資料還未提交,另乙個事務在此時讀取了同乙份資料,由於某些原因,前乙個事務rollback了操作,則後乙個事務所讀取到的資料就會是不正確的。

不可重複讀(non-repeatable read):在乙個事務的兩次相同查詢中資料不一致,這可能是兩次查詢過程中間插入了另乙個事務更新了原有的資料。也可以說:事務t1讀取某一資料後還未提交,事務t2對其做了修改,當事務t1再次讀該資料時得到與前一次不同的值。

幻讀(phantom read):在乙個事務的兩次查詢中資料筆數不一致,例如有乙個事務查詢了幾列(row)資料,而另乙個事務卻在此時插入了新的幾列資料,先前的事務在接下來的查詢中,就會發現有幾列資料是它先前所沒有的。

三、解決方法--4類事務隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。

資料庫系統有四個隔離級別。對資料庫使用何種隔離級別要審慎分析,因為

1. 維護乙個最高的隔離級別雖然會防止資料的出錯,但是卻導致了並行度的損失,以及導致死鎖出現的可能性增加。

2. 然而降低隔離級別,卻會引起一些難以發現的bug。

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

read uncommitted(讀取未提交內容)

在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。允許髒讀。

read committed(讀取提交內容)

這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。這種隔離級別解決了髒讀問題,但會出現不可重複讀問題。因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。

repeatable read(可重讀)

這是mysql的預設事務隔離級別它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。解決了髒資料和不可重複讀問題,通過「共享讀鎖」和「排他寫鎖」實現。讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。

不過理論上,這會導致另乙個棘手的問題:幻讀 (phantom read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。

serializable(可序列化)

這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

√: 可能出現    ×: 不會出現

髒讀不可重複讀

幻讀read uncommitted√√

√read committed×√

√repeatable read××

√serializable××

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

影響事務併發正確性的常見因素包括事務的隔離級別、sql語句對應的鎖。這兩者相互結合保證事務併發的正確性,來避免以下常見的4種事務併發問題:

1.髒讀2.不可重複讀3.幻讀4.更新丟失

故在分析事務併發正確性時要重點關注事務的隔離級別是什麼,sql語句是否會加鎖,鎖是什麼

上面四種事務隔離是通過各種鎖機制來實現的。鎖機制可以進一步了解。

mysql對四種事務隔離場景進行實驗:

四、mysql事務隔離級別的查詢和設定

1.檢視當前會話隔離級別

select @@tx_isolation;

2.檢視系統當前隔離級別

select @@global.tx_isolation;

3.設定當前會話隔離級別

set session transaction isolatin level repeatable read;

4.設定系統當前隔離級別

set global transaction isolation level repeatable read;

5.命令列,開始事務時

set autocommit=off 或者 start transaction

1、2、

事務隔離級別總結

事務 transaction 是資料庫系統中一系列操作的乙個邏輯單元,所有操作要麼全部成功要麼全部失 敗。事務是區分檔案儲存系統與nosql資料庫重要特性之一,其存在的意義是為了保證即使在併發情況下也 能正確的執行crud操作。怎樣才算是正確的呢?這時提出了事務需要保證的四個特性即acid a 原子...

事務隔離級別

1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...

事務隔離級別

四種隔離級別 隔離級別 髒 讀不可重複讀取 幻 像讀操作未提交 read uncommitted 是是 是讀操作已提交 read committed 否是 是可重複讀 repeatable read 否否 是快照否否 否可序列讀 serializable 否否 否 sql server 還支援使用行...