Mysql的事務隔離級別詳解

2021-10-10 04:43:39 字數 2304 閱讀 3615

mysql的事務隔離級別詳解

什麼是事務

事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,乙個事務中的一系列的操作要麼全部成功,要麼乙個都不做。

事務的結束有兩種,當事務中的所有步驟全部成功執行時,事務提交。如果其中乙個步驟失敗,將發生回滾操作,撤消之前到事務開始時的所有操作。另外,這篇分布式事務不理解?一次給你講清楚!推薦大家閱讀。

編者按:所有的操作都成功執行才會提交(提交完畢才屬於真正完成操作),否則回退所有動作,原始狀態。

事務的 acid

事務具有四個特徵:

原子性( atomicity )、一致性( consistency )、隔離性( isolation )和持續性( durability )。

這四個特性簡稱為 acid 特性。

原子性。事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做

編者按:乙個事務就是乙個原子,完整性,不會停留在某個中間狀態,要麼初始,要麼成功結束。

一致性。事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。因此當資料庫只包含成功事務提交的結果時,就說資料庫處於一致性狀態。如果資料庫系統執行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對資料庫所做的修改有一部分已寫入物理資料庫,這時資料庫就處於一種不正確的狀態,或者說是不一致的狀態。

編者按:資料庫應該不管多少併發事務執行,都應該保持一致性。

隔離性。乙個事務的執行不能對其它事務形成干擾。即乙個事務內部的操作及使用的資料對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。

編者按:每個之間互不影響,及時相同操作,也如同序列一樣,順序執行,同一時間乙份資料執行。

持續性。也稱永久性,指乙個事務一旦提交,它對資料庫中的資料的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。

編者按:提交完畢的事務不可回滾。覆水難收。

mysql的四種隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。

read uncommitted(讀取未提交內容)

在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(dirty read)。

編者按:就好比還沒確定的訊息,你卻先知道了發布出去,最後又變更了,就是說瞎話了。常說的髒讀,讀到了還未提交的。

read committed(讀取提交內容)

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

編者按:只能讀取到已經提交的事務。

repeatable read(可重讀)

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

編者按:幻讀。讀到已提交的資料。

serializable(可序列化)

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

編者按:事務順序執行,沒有並行,完全杜絕幻讀。

這四種隔離級別採取不同的鎖型別來實現,若讀取的是同乙個資料的話,就容易發生問題。例如:

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

不可重複讀(non-repeatable read):在乙個事務的兩次查詢之中資料不一致,這可能是兩次查詢過程中間插入了乙個事務更新的原有的資料。

幻讀(phantom read):在乙個事務的兩次查詢中資料筆數不一致,例如有乙個事務查詢了幾列(row)資料,而另乙個事務卻在此時插入了新的幾列資料,先前的事務在接下來的查詢中,就有幾列資料是未查詢出來的,如果此時插入和另外乙個事務插入的資料,就會報錯。讀取到新提交的資料,發生在插入階段。

mysql事務隔離級別詳解 事務的隔離級別詳解

事務的隔離級別 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。問題的提出 資料庫是要被廣大客戶所共享訪問的,那麼在資料庫操作過程中很可能出現以下幾種不確定情況。更新丟失 兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的...

MySQL事務,事務隔離級別詳解

1 什麼是事務指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。2 事務的4個特性原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 3 每個特性的意思 原子性原子性是指事務是乙個不可再分割的工作單位,事務中的...

MySQL事務隔離級別詳解

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因...