標籤:multi order 競爭 資料 一個 bsp 控制 四種 --
一、四種隔離等級
Read Uncommitted(讀取未提交內容)
在該隔離等級,所有事務都可以看到其他未提交事務的執行結果。本隔離等級很少用於實際應用,因為它的效能也不比其他層級好多少。讀取未提交的資料,也被稱之為髒讀(Dirty Read)。
Read Committed(讀取提交內容)--Sql Server , Oracle預設層級
這是大多數資料庫系統的預設隔離等級。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離等級 也支援所謂的不可重複讀取(Nonrepeatable Read),因為同一事務的其他執行個體在該執行個體處理其間可能會有新的commit,所以同一select可能返回不同結果。
Repeatable Read(可重讀)--MySQL預設層級
它確保同一事務的多個執行個體在並發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另一個事務又在該範圍插入入了新行,當使用者再讀取該範圍的資料行時,會發現有新的“幻影” 行。InnoDB和Falcon儲存引擎通過多版本並發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。
Serializable(可序列化)
這是最高的隔離等級,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共用鎖定。在這個層級,可能導致大量的逾時現象和鎖競爭。
在MySQL中,實現了這四種隔離等級,分別有可能產生問題如下所示:
| 交易隔離等級 |
髒讀 |
不可重複讀取 |
幻讀 |
| 讀未提交(read-uncommitted) |
是 |
是 |
是 |
| 不可重複讀取(read-committed) |
否 |
是 |
是 |
| 可重複讀(repeatable-read) |
否 |
否 |
是 |
| 序列化(serializable) |
否 |
否 |
否 |
二、事務的並發問題
1、髒讀(Drity Read):事務A讀取了事務B更新的資料,然後B復原操作,那麼A讀取到的資料是髒資料。
2、不可重複讀取(Non-repeatable read):事務 A 多次讀取同一資料,事務 B 在事務A多次讀取的過程中,對資料作了更新並提交,導致事務A多次讀取同一資料時,結果 不一致。
3、幻讀(Phantom Read):系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。
小結:不可重複讀取的和幻讀很容易混淆,不可重複讀取側重於修改,幻讀側重於新增或刪除。解決不可重複讀取的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
MySQL交易隔離等級