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