程式設計師面試寶典之Mysql資料庫Innodb引擎的4個隔離級別

題目:請闡述Mysql Innodb引擎的4個隔離級別

難度:三星

面試頻率:五星

這道題真的是一道資料庫的高頻題,資料庫題除了索引的原理之外就是這道題的面試頻率最高。

1。Read uncommitted(讀未提交):,最低的隔離級別,可以一個事務讀到其他事務沒有提交的資料,也稱髒讀,這個隔離級別很少人用

2。Read committed(讀已提交):相比於讀未提交,這個隔離級別只能讀到其他事物已經提交了的資料,這個隔離級別用得比較多。但是不是Mysql預設的隔離級別

3。Repeatable read(可重複讀): 在讀已提交隔離級別中,2次讀取同一個變數如果其他事務修改了它的值,會讀到的不一樣。而在這個隔離級別中,顧名思義,一個事務開始讀了。多次讀到的值可以保證是一樣的

4。Serializable 序列化 在這個隔離級別下,所有的事務都將序列操作,是隔離級別最高的也是效率最低的,很少人用

面試官追問:Innodb引擎預設隔離級別是哪個

答:可重複讀

面試官追問:可重複讀的實現原理

答:使用了MVCC多版本控制(類似樂觀鎖),Innodb引擎會給每一行資料加一個版本號資訊,當一個事務修改一個數據時會增加它的版本號+1,當一個事務開始的時候會快取下此時的版本號,後面讀取的時候只會讀取這個版本號的資料,因此別的事務提交了修改資料的版本號大於它,因此不會被讀到

面試官追問:事務的隔離級別如何設定:

答:在Mysql命令列下呼叫命令 set global。tx_isolation,但這樣Mysql重啟失效,修改my。cnf來永久設定

[mysqld]3 transaction-isolation = REPEATABLE-READ

面試官追問:可重讀讀有什麼問題

答:會出現幻讀,幻讀是指事務讀取到一個值無法準確繼續後續操作。例如讀取一個值,沒有則插入,但是等插入的時候其他事務已經插入了,這就會導致插入失敗,解決辦法:sql語句顯示加鎖 :select xxxx for update,其他事務修改資料則會阻塞