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