隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
讀未提交 | 可以出現(xiàn) | 可以出現(xiàn) | 可以出現(xiàn) |
讀提交 | 不允許出現(xiàn) | 可以出現(xiàn) | 可以出現(xiàn) |
可重復(fù)讀 | 不允許出現(xiàn) | 不允許出現(xiàn) | 可以出現(xiàn) |
序列化 | 不允許出現(xiàn) | 不允許出現(xiàn) | 不允許出現(xiàn) |
主要是讀已提交和可重復(fù)讀比較難區(qū)分,所以我們看個(gè)小例子。先創(chuàng)建一張表,并插入數(shù)據(jù)1
create database test; use test; create table test(id int primary key); insert into test(id) values(1);
事務(wù)A | 事務(wù)B |
啟動(dòng)事務(wù)查詢得到1 | 啟動(dòng)事務(wù) |
查詢得到1 | |
將1改為2 | |
查詢得到V1 | |
提交事務(wù)B | |
查詢得到V2 | |
提交事務(wù)A | |
查詢得到V3 |
我們來(lái)看看在不同的隔離級(jí)別下,事務(wù)A會(huì)有哪些不同的返回結(jié)果,也就是圖里面V1、V2、V3的返回值分別是什么。
數(shù)據(jù)庫(kù)里面會(huì)創(chuàng)建一個(gè)視圖,訪問(wèn)的時(shí)候以視圖的邏輯結(jié)果為準(zhǔn)。在“可重復(fù)讀”隔離級(jí)別下,這個(gè)視圖是在事務(wù)啟 動(dòng)時(shí)創(chuàng)建的,整個(gè)事務(wù)存在期間都用這個(gè)視圖。在“讀提交”隔離級(jí)別下,這個(gè)視圖是在每個(gè)SQL語(yǔ)句開(kāi)始執(zhí)行的時(shí)候創(chuàng)建的。 這里需要注意的是,“讀未提交”隔離級(jí)別下直接返回記錄上的最新值,沒(méi)有視圖概念;而“串行化”隔離級(jí)別下直接用加鎖的方式來(lái)避免并行訪問(wèn)。
那什么時(shí)候需 要**“可重復(fù)讀”**的場(chǎng)景呢?
假設(shè)你在管理一個(gè)個(gè)人銀行賬戶表。一個(gè)表存了每個(gè)月月底的余額,一個(gè)表存了賬單明細(xì)。這時(shí)候你要做數(shù)據(jù)校對(duì),也就是判斷上個(gè)月的余額和當(dāng)前余額的差額,是否與本月的賬單明細(xì)一致。你一定希望在校對(duì)過(guò)程中,即使有用戶發(fā)生了一筆新的交 易,也不影響你的校對(duì)結(jié)果。
事務(wù)隔離的實(shí)現(xiàn)
在MySQL中,實(shí)際上每條記錄在更新的時(shí)候都會(huì)同時(shí)記錄一條回滾操作。記錄上的最新值,通過(guò)回滾操作,都可以得到前一個(gè)狀態(tài)的值。假設(shè)一個(gè)值從1被按順序改成了2、3、4,在回滾日志里面就會(huì)有類(lèi)似下面的記錄。
當(dāng)前值是4,但是在查詢這條記錄的時(shí)候,不同時(shí)刻啟動(dòng)的事務(wù)會(huì)有不同的read-view。如圖中看到的,在視圖A、B、C里面, 這一個(gè)記錄的值分別是1、2、4,同一條記錄在系統(tǒng)中可以存在多個(gè)版本,就是數(shù)據(jù)庫(kù)的多版本并發(fā)控制(MVCC)。對(duì)于 read-view A,要得到1,就必須將當(dāng)前值依次執(zhí)行圖中所有的回滾操作得到。即使現(xiàn)在有另外一個(gè)事務(wù)正在將4改成5,這個(gè)事務(wù)跟read-view A、B、C對(duì)應(yīng)的事務(wù)是不會(huì)沖突的。
回滾日志總不能一直保留吧,什么時(shí)候刪除呢?
在不需要的時(shí)候才刪除。也就是說(shuō),系統(tǒng)會(huì)判斷,當(dāng)沒(méi)有事務(wù)再需要用到這些回滾日志時(shí),回滾日志會(huì)被刪除。
什么時(shí)候才不需要了呢?
就是當(dāng)系統(tǒng)里沒(méi)有比這個(gè)回滾日志更早的read-view的時(shí)候。
為什么盡量不要使用事務(wù)?
事務(wù)意味著系統(tǒng)里面會(huì)存在很老的事務(wù)視圖,在這個(gè)事務(wù)提交之前,回滾記錄都要保留, 這會(huì)導(dǎo)致大量占用存儲(chǔ)空間。除此之外,事務(wù)還占用鎖資源,可能會(huì)拖垮庫(kù)。
以上就是關(guān)于msyql事務(wù)隔離你要知道的詳細(xì)內(nèi)容,更多關(guān)于mysql事務(wù)隔離的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:合肥 臺(tái)灣 阜新 鷹潭 北京 貴州 鎮(zhèn)江 日照
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《關(guān)于msyql事務(wù)隔離你要知道》,本文關(guān)鍵詞 關(guān)于,msyql,事務(wù),隔離,你要,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。