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