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