中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

確定能搞懂:臟讀、讀已提交、可重復讀、幻讀?

發布時間:2020-07-02 05:02:22 來源:網絡 閱讀:452 作者:路人甲Java 欄目:編程語言

今天剛好在看某個公眾號中提到了這個知識點,發現對這塊的解釋不是很到位,尤其是對幻讀這塊的解釋,很多文章都是相互復制粘貼,所以我們看到的大部分解釋都是類似的,很多人對幻讀這款不是很理解,讓看的人云里霧里、暈暈乎乎,所以拿出來說明一下;大家也可以留言,相互交流。

主要內容

本文以mysqlsql為例,介紹如下內容:
1、什么是臟讀?
2、什么是讀已提交?
3、什么是可重復讀?
4、什么是幻讀?

臟讀、讀已提交、可重復讀、幻讀都是和事務隔離級別相關的一些東西,所以需要大家先理解事務相關的一些概念。

什么是事務?

我們這里所說的事務大多數是指數據的事務,事務是指一個業務操作,一個業務操作內部包含多個小的子操作,這些操作要目全部一起執行成功,要么全部執行失敗,不存在說一部分成功一部分失敗的情況。

事務有以下特性(ACID)
1、原子性(Atomicity)
事務作為一個整體被執行,包含在其中的對數據庫的操作要么全部被執行,要么都不執行。

2、一致性(Consistency)
事務應確保數據庫的狀態從一個一致狀態轉變為另一個一致狀態。一致狀態的含義是數據庫中的數據應滿足完整性約束。

3、隔離性(Isolation)
多個事務并發執行時,一個事務的執行不應影響其他事務的執行。

4、持久性(Durability)
已被提交的事務對數據庫的修改應該永久保存在數據庫中

何為臟讀?

一個事務在執行的過程中讀取到了其他事務還沒有提交的數據。
這個還是比較好理解的。

何為讀已提交

從字面上我們就可以理解,即一個事務操作過程中可以讀取到其他事務已經提交的數據。

事務中的每次讀取操作,讀取到的都是數據庫中其他事務已提交的最新的數據(相當于當前讀)

何為可重復讀

一個事務操作中對于一個讀取操作不管多少次,讀取到的結果都是一樣的。

可重復讀中有種情況需要注意
如,事務A:
1、打開事務
2、select count(id) from t_a,返回10行
3、向A表插入一條記錄
4、select count(id) from t_a,返回11行
5、提交事務

有疑問?
上面不是說可重復讀不管讀取多少次,結果都是一樣的,這個地方為什么不一樣呢?
可重復讀是指對于其他事務操作的數據,多次讀取的結果都是一樣的,重點在于其他事務的數據,如果第一次讀取能夠讀取到其他事務的數據,后面不管其他事務有任何其他任何操作,都不會影響已讀取到的其他事務產生的數據。但是自己所在的事務中產生的數據,自己是都可以讀取到的。

何為幻讀

臟讀、不可重復讀、可重復讀、幻讀,其中最難理解的是幻讀

以mysql為例:

幻讀在可重復讀的模式下才會出現,其他隔離級別中不會出現

幻讀現象例子:
可重復讀模式下,比如有個用戶表,手機號碼為主鍵,有兩個事物進行如下操作

事務A操作如下:
1、打開事務
2、查詢號碼為X的記錄,不存在
3、插入號碼為X的數據,插入報錯(為什么會報錯,先向下看)
4、查詢號碼為X的記錄,發現還是不存在(由于是可重復讀,所以讀取記錄X還是不存在的)

事物B操作:在事務A第2步操作時插入了一條X的記錄,所以會導致A中第3步插入報錯(違反了唯一約束)

上面操作對A來說就像發生了幻覺一樣,明明查詢X(A中第二步、第四步)不存在,但卻無法插入成功

幻讀可以這么理解:事務中后面的操作(插入號碼X)需要上面的讀取操作(查詢號碼X的記錄)提供支持,但讀取操作卻不能支持下面的操作時產生的錯誤,就像發生了幻覺一樣。

十年java老兵,只生產干貨,公眾號:路人甲Java,微信號:itsoku

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄梅县| 夹江县| 彩票| 沙洋县| 陆河县| 乡城县| 临沧市| 万全县| 彩票| 德阳市| 东辽县| 恭城| 元谋县| 慈溪市| 柞水县| 吉林省| 和平县| 宜州市| 景谷| 岫岩| 容城县| 农安县| 介休市| 亳州市| 锡林郭勒盟| 上林县| 泰州市| 东阿县| 扎赉特旗| 托克托县| 印江| 宝鸡市| 梓潼县| 呼玛县| 淳安县| 海林市| 昌平区| 神农架林区| 古田县| 城市| 莒南县|