資料庫事務由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資料庫引擎將不會回滾前⾯的事務。
什麼是幻讀,幻讀會有什麼問題
幻讀指的是乙個事務在前後兩次查詢同乙個範圍的時候,後一次查詢看到了前一次查詢沒有看到的行。幻讀 做乙個說明 在可重複讀隔離級別下,普通的查詢是快照讀,是不會看到別的事務插入的資料的。因此,幻讀在當前讀下才會出現。第二次檢視,發現被修改的 行 不能稱為幻讀,幻讀僅專指 新插入的行 當前讀 也叫即時讀,...
讀文筆記 《你真的理解什麼是「財富自由」嗎?》
首先,我們來講講 財富自由 的定義,來自維基百科。財富自由是指,你無須為生活開銷而努力為錢工作的狀態。簡單的說,你的資產產生的被動收入必須至少等於或超過你的日常開支,這是我們大多數人最渴望達到的狀態,如果進入這種狀態,我們就可以稱之為退休或其他各種名稱。但實際上,財富自由最根本的不是財富,本質上是時...
你真的了解什麼是程序嗎?
我們的作業系統裡面會有很多應用,比如手機裡面的各種應用,每乙個應用都有乙個或多個程序,而且每個應用執行時又會用到很多不同的資源。程序就幫助我們隔離了不同的資源,利用各種資源幫助應用管理著各種狀態,因此,我們經常說程序是資源分配的最小單位。多程序的目的是為了滿足使用者的需要,同時對多個資源進行處理,簡...