幻讀和不可重複讀的個人理解和區分
阿新 • • 發佈:2019-02-18
幻讀和不可重複讀常常讓人感到疑惑和難以區分。以下,是個人對幻讀和不可重複讀的一些理解和區分。
首先兩者官方概念如下,
不可重複讀(non-repeatable read):在一個事務內,多次讀同一個資料。在這個事務還沒有結束時,另一個事務也訪問該同一資料。那麼,在第一個事務的兩次讀資料之間。由於第二個事務的修改,那麼第一個事務讀到的資料可能不一樣,這樣就發生了在一個事務內兩次讀到的資料是不一樣的,因此稱為不可重複讀,即原始讀取不可重複。
幻讀(phantom read):幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,比如這種修改涉及到表中的“全部資料行”。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入“一行新資料”。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣.一般解決幻讀的方法是增加範圍鎖,鎖定檢索範圍為只讀,這樣就避免了幻讀。
那麼從形成的原因來看,不可重複讀大多由update,delete造成,而幻讀一般由insert造成。
從控制的角度來看,避免不可重複讀只要鎖定where所對應的行(比如行鎖),而避免幻讀需要引入範圍鎖或者表鎖。(比如innodb以間隙鎖實現)