你真的明白什麼是幻讀嗎?
資料庫事務由4ACID定義的。隔離級別(ACID中的I)是允許用戶指定數據完整的折中方案。隔離級別越弱,產?問題的可能性越多。這裡我們講一下幻讀問題。
並發事務的數據更新
如果?個事務基於給定的數據列集合做業務決策,而沒有範圍鎖,一個並發的事務可能會導致新增一?記錄,引發這種特殊的情況。
在上圖中,流程如下:
Alice和Bob開啟了資料庫的兩個事務;
Bob讀取post_comment表中所有post_id為1的數據;
Alice增加了一條post_id為1的數據;
Alice提交了她的事務;
如果Bob重複讀取post_id為1的數據,他將發現不一樣的結果集;
如果當前事務基於第一次返回的結果做了業務決策,那麼就會產生問題。
資料庫如何防止這種現象
SQL標準這麼定義幻讀,在兩個連續的查找之間一個並發的修改事務修改了查詢的數據集,導致這兩個查詢返回了不同的結果。
儘管提供讀一致性是可序列化的強制要求,但是還不夠。例如,一個買家可能購買產品?不知道在他提交訂單之後的瞬間,商品有更低的報價。
兩階段加鎖(2PL-based)序列化隔離使用謂詞鎖,通過訪問MVCC資料庫引擎返回的快照,來防止幻讀。
儘管如此,並發的事務仍然有可能修改被讀取過的數據。甚?MVCC資料庫引擎實現了事務調度,不同的請求通過兩階段加鎖實現依然可能返回不同的結果。例如,第2個事務添加了一條記錄,不在第1個事務的讀取記錄中。在這種特殊的應?場景中,很多MVCC資料庫引擎將不會回滾前?的事務。
本文作者VLADMIHALCEA,由鄧啟明翻譯,轉載本文請註明出處,技術原創及架構實踐文章,歡迎通過公眾號菜單「聯繫我們」進行投稿。
※螞蟻金服研發的金融級分散式中間件SOFA背後的故事
※數字金融時代的雲原生架構轉型的關鍵挑戰和應對思路
TAG:高可用架構 |