一、事務隔離級別
在資料庫系統中,隔離是定義乙個操作對資料所做的改變如何/何時對其它的並行操作可見。
在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。
事務隔離級別:乙個事務對資料庫的修改與並行的另乙個事務的隔離程度。
二、事務併發執行涉及到的問題
資料庫是要被廣大客戶所共享訪問的,那麼在資料庫操作過程中很可能出現以下幾種不確定情況:
髒讀(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 還支援使用行...