題目:請闡述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,其他事務修改資料則會阻塞