當前位置: 妍妍網 > 碼農

MySQL 事務預設隔離級別是什麽?這必須得會啊

2024-07-16碼農

此答案節選自鴨鴨最近弄的 面試鴨小程式 ,更多 大廠常問面試題 ,可以點選下面的小程式進行閱讀哈!


MySQL 預設的隔離級別是可重復讀( Repeatable Read ),即 RR。

原因是為了相容早期 binlog 的 statement 格式問題,如果是使用讀已送出、讀未送出等隔離級別,使用了 statement 格式的 binlog 會導致主從(備)資料庫數據不一致問題。

以上就是答案。

接下來我們來展開講解下,便於大家理解。

MySQL 在使用過程中,為了避免單台故障,需要使用主從(備)機制:

而 MySQL 的主從(備)涉及 binlog 的復制,即從(備)庫的數據是透過 binlog 從主庫復制過來的。

在早期,MySQL binlog 僅支持 statement 格式,這個格式其實存的就是 原先的SQL 語句 ,這就使得在讀未送出(ru)和讀送出(rc)兩種隔離級別下會出問題。

我們來實際看個例子:

例如有兩個事務 A 和 B ,以下圖的時間順序執行:

在讀已送出隔離級別且手動送出事務的情況下, 插入的 5 這條記錄會被保留。

但是由於事務 B 先送出,所以它會先被記錄在 binlog 中, 這個操作就導致了問題

binlog 的記錄順序是:

使得從庫同步 binlog 重放的時候,先執行了 insert 再執行 delete, 這就使得從庫的數據與主庫不一致了! , 5 這條記錄也會被刪除了。

所以,為了避免這個問題,只能預設為可重復讀級別。因為這個隔離級別下有間隙鎖(Gap Locks)、臨鍵鎖(Next-Key Locks),所以事務 B 是無法先送出的,會被事務 A 阻塞,因此 binlog 的記錄只能是先 delete 再 insert ,這樣就沒問題了。

最後

最後再推薦下鴨鴨目前努力在做 面試小程式神器 ,已經有 1600 多道面試題目啦,歡迎大家來閱讀!如果大家有不會的面試題,也可以在小程式內反饋!鴨鴨會第一時間為大家解答!

歡迎大家來閱讀!如果大家有不會的面試題,也可以在小程式內反饋!鴨鴨會第一時間為大家解答!

我是鴨鴨,我們下期見~