事務隔離級別要實際解決的問題
髒讀指的是讀到了其他事務未提交的資料,未提交意味著這些資料可能會回滾,也就是可能最終不會存到資料庫中,也就是不存在的資料。讀到了並一定最終存在的資料,這就是髒讀。
不可重複讀指的是在同一事務內,不同的時刻讀到的同一批資料可能是不一樣的,可能會受到其他事務的影響,比如其他事務改了這批資料並提交了。通常針對資料更新(update)操作。
幻讀是針對資料插入(insert)操作來說的。假設事務a對某些行的內容作了更改,但是還未提交,此時事務b插入了與事務a更改前的記錄相同的記錄行,並且在事務a提交之前先提交了,而這時,在事務a中查詢,會發現好像剛剛的更改對於某些資料未起作用,但其實是事務b剛插入進來的,讓使用者感覺很魔幻,感覺出現了幻覺,這就叫幻讀。
各個事務隔離級別對問題的解決
read uncommitted (讀未提交)
事務中的修改,即使未提交,對於其他事務也是可見的。
原理:對於讀-寫不進行加鎖或者mvcc控制,所以導致可見。
作為最低級別的隔離級別
read committed (讀已提交)
乙個事務只能讀取已經提交的事務所做的修改,即使乙個事務所做的修改在提交之前對於其他事務都是不可見的。
原理:每個 select 語句都有自己的乙份快照,而不是乙個事務乙份,所以在不同的時刻,查詢出來的資料可能是不一致的。利用了mvcc多版本併發控制
read repeatable (可重複讀)
保證在同乙個事務中多次讀取同一資料的結果是一樣的
原理:乙個事務乙份讀取快照,保證了在同一事務中讀取的同一資料的結果都是一樣的。利用了mvcc多版本併發控制
預設來說解決了幻讀:對於聚簇索引採用行級鎖,其他欄位的查詢/修改採用了next-key鎖,防止一定範圍內的別的事務進行的插入操作。
serializable (事務序列化)
強制事務序列執行,這樣多個事務互不干擾。讀的時候加共享鎖,也就是其他事務可以併發讀,但是不能寫。寫的時候加排它鎖,其他事務不能併發寫也不能併發讀。
原理:將事務的執行變為順序執行,與其他三個隔離級別相比,它就相當於單執行緒,後乙個事務的執行必須等待前乙個事務結束。
MySQL事務隔離級別的實現原理
在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀...
MySQL事務隔離級別的實現原理
在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀...
mysql 事務隔離級別的實現原理
目錄 一 事務的四要素 acid 二 mysql的事務的隔離級別 三 多版本併發控制 multi version concurrency control 3.1 功能 3.2 原理 1.原子性 atomicity all done 或者 all not done 2.一致性 consistency ...