事物隔离级别(一)
四種事物隔離級別由低到高分別可以避免臟讀、不可重復(fù)讀和幻讀。但是隨著事物隔離級別的提高,系統(tǒng)開銷也會不斷提升。MySQL默認(rèn)的事物隔離級別是第三級(Repeatable read)也是最常用的級別。
| ? | 臟讀 ? ? ? ? ? ? ? ? ? ? ? ?? | 不可重復(fù)讀 ? ? ? ? ? ? ? ? ?? | 幻讀 ? ? ? ? ? ? ? ? ? ?? |
| Read uncommitted | √ | √ | √ |
| Read committed | ? | √ | √ |
| Repeatable read(默認(rèn)) | ? | ? | √ |
| Serializable | ? | ? | ? |
?
?
?
?
?
?
?
一、Read uncommitted
處在Read uncommitted級別的事物能夠被其他事物讀取語句間的數(shù)據(jù),因此會出現(xiàn)其它事物讀取了還未提交的數(shù)據(jù)。如果當(dāng)前事物不發(fā)生回滾,則不會產(chǎn)生問題。效率最高,但不推薦。
二、Read committed
當(dāng)前事物隔離級別,其它事物無法讀取到已經(jīng)被修改但是還未被提交的數(shù)據(jù)。但是其它事物線程也不會被阻塞,這意味著如果存在并發(fā)事物嘗試讀取當(dāng)前正在被修改的數(shù)據(jù)行時(shí)可能會讀取到原始數(shù)據(jù)。要避免這樣的問題需要當(dāng)有事物正在修改行級數(shù)據(jù)的時(shí)候,其它事物無論讀或者寫都必須被阻塞。
上表兩次發(fā)出的select A from語句都是對同一行數(shù)據(jù)的查詢。由于兩條事物相互隔離,因此不會讀到另一條線程中的操作數(shù)。但是依然可以讀取當(dāng)前行的原始數(shù)據(jù),因此會造成兩次讀取的結(jié)果不一致。
三、Repeatable read(默認(rèn))
Repeatable read級別是MySQL默認(rèn)的隔離級別,除非使用者明確修改。當(dāng)前級別下的事物會同時(shí)為當(dāng)前行增加讀寫的行級鎖或頁級鎖,操作完畢以后隨即unlock tables;如果在并發(fā)的事物中存在讀取當(dāng)前行數(shù)據(jù)的行為時(shí),事物將被阻塞。直到獲取行級鎖的時(shí)候才能夠繼續(xù)操作并同時(shí)阻塞別的線程。
在當(dāng)前隔離級別下,大部分的數(shù)據(jù)操作都是安全的。唯一可能發(fā)生問題的情況是事物需要插入數(shù)據(jù)或刪除數(shù)據(jù)的時(shí)候,由于行級鎖并未對表鎖定。因此對于數(shù)據(jù)表的遍歷可能會發(fā)生幻讀錯誤。解決幻讀問題的關(guān)鍵事物對任何數(shù)據(jù)表的操作,同時(shí)使用表級鎖。其它任何并發(fā)事物都必須等待當(dāng)前操作完成。從宏觀上觀察,就是杜絕了事物的并發(fā)操作。
四、Serializable
序列化事物是最高的事物隔離級別,也是最占用系統(tǒng)資源的操作。可以避免所有問題,但也不被推薦。
結(jié)語:
有一點(diǎn)需要在這里說明,以上對于數(shù)據(jù)庫隔離級別的闡釋主要是基于MySQL中的InnoDB引擎。甚至從JavaEE程序員的角度也可以這樣理解。但是,事務(wù)隔離級別和各種數(shù)據(jù)庫鎖機(jī)制并不是一一對應(yīng)的關(guān)系。對DBA來說,無論是實(shí)現(xiàn)還是理解往往更加復(fù)雜。更深入一些的知識,我打算在下一篇博客中更新...(不過也可能不更新,大家不用期待)
安利時(shí)間:最近一直在找工作,有合適的機(jī)會請推薦一下^_^
轉(zhuǎn)載于:https://www.cnblogs.com/learnhow/p/5234461.html
總結(jié)
- 上一篇: uno怎么读?
- 下一篇: webService 客户端调用及异常信