一、如何理解SQL的可重復(fù)讀和幻讀之間的區(qū)別
不可重復(fù)讀:事務(wù) A 多次讀取同一數(shù)據(jù),事務(wù) B 在事務(wù)A多次讀取的過(guò)程中,對(duì)數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時(shí),結(jié)果不一致。
幻讀:系統(tǒng)管理員A將數(shù)據(jù)庫(kù)中所有學(xué)生的成績(jī)從具體分?jǐn)?shù)改為ABCDE等級(jí),但是系統(tǒng)管理員B就在這個(gè)時(shí)候插入了一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒(méi)有改過(guò)來(lái),就好像發(fā)生了幻覺(jué)一樣,這就叫幻讀。
小結(jié):兩者的共同點(diǎn)是:拿到某一時(shí)刻的數(shù)據(jù),比如T1到T2的時(shí)間段中,我只能看到T1時(shí)刻的數(shù)據(jù)。
兩者的不同點(diǎn)是:運(yùn)用場(chǎng)景不同,解決方式不同。前者是在一致性讀場(chǎng)景下,通過(guò)事務(wù)開(kāi)始的時(shí)候聲明一致性視圖實(shí)現(xiàn)的;后者是在當(dāng)前讀場(chǎng)景下,通過(guò)加間隙鎖的方式實(shí)現(xiàn)“防止幻讀”的。
比如,在備份數(shù)據(jù)庫(kù)的時(shí)候,需要拿到所有表在某一時(shí)刻的數(shù)據(jù),需要的是可重復(fù)讀。
可重復(fù)度隔離級(jí)別下,在事務(wù)開(kāi)始的時(shí)候,就確定了一個(gè)視圖,之后的數(shù)據(jù)改動(dòng)對(duì)其不可見(jiàn),從而達(dá)到可重讀的效果,這個(gè)我們稱為一致性讀。
但是在進(jìn)行select for update這種當(dāng)前讀的時(shí)候,視圖就不起作用了,意味著在兩次查詢中,如果有人插入數(shù)據(jù),那么兩次讀取結(jié)果不一致,這就是幻讀,解決方法就是通過(guò)加間隙鎖來(lái)防止幻讀。
不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問(wèn)題只需鎖住滿足條件的行,解決幻讀需要鎖表。
延伸閱讀:
二、Vertica是什么
Vertica是一款基于列存儲(chǔ)的MPP(massively parallel processing)架構(gòu)的數(shù)據(jù)庫(kù)。
它可以支持存放多至PB(Petabyte)級(jí)別的結(jié)構(gòu)化數(shù)據(jù)。Vertica是由關(guān)系數(shù)據(jù)庫(kù)大師Michael Stonebraker(2014 年圖靈獎(jiǎng)獲得者)所創(chuàng)建,于2011年被惠普收購(gòu)并成為其核心大數(shù)據(jù)平臺(tái)軟件。Vertica 采用無(wú)共享的MPP 架構(gòu),基于工業(yè)標(biāo)準(zhǔn)的x86 服務(wù)器,擁有高可擴(kuò)展性。Vertica 集群中的所有節(jié)點(diǎn)100%對(duì)等,集群中沒(méi)有主節(jié)點(diǎn)或其他共享資源。通過(guò)增加節(jié)點(diǎn),就可以線性地?cái)U(kuò)展集群的計(jì)算能力和數(shù)據(jù)處理容量。Vertica 是真正的純列式數(shù)據(jù)庫(kù),優(yōu)化器和執(zhí)行引擎可以忽略表中與查詢無(wú)關(guān)的列。Vertica 不僅僅按列式存儲(chǔ)數(shù)據(jù),還主動(dòng)地根據(jù)列數(shù)據(jù)的特點(diǎn)和查詢的要求選用優(yōu)異的算法對(duì)數(shù)據(jù)進(jìn)行排序和編碼壓縮,這就極大地降低磁盤(pán)I/O 消耗。同時(shí),Vertica 的執(zhí)行引擎和優(yōu)化器也是基于列式數(shù)據(jù)庫(kù)設(shè)計(jì)的,編碼壓縮過(guò)的列數(shù)據(jù)在Vertica 的執(zhí)行引擎中進(jìn)行過(guò)濾、關(guān)聯(lián)、分組等操作時(shí)不需要解反編碼,從而大大降低了CPU 和內(nèi)存消耗。