mysql 默認隔離級別是RR,為什么公司會改成RC


先回憶下mysql的四個隔離級別:

  READ-UNCOMMITTED(讀取未提交): 事務的修改,即使沒有提交,對其他事務也都是可見的。事務能夠讀取未提交的數據,這種情況稱為臟讀
  READ-COMMITTED(讀取已提交): 事務讀取已提交的數據,大多數數據庫的默認隔離級別。當一個事務在執行過程中,數據被另外一個事務修改,造成本次事務前后讀取的信息不一樣,這種情況稱為不可重復讀
  REPEATABLE-READ(可重復讀): 這個級別是MySQL的默認隔離級別,它解決了臟讀的問題,同時也保證了同一個事務多次讀取同樣的記錄是一致的,但這個級別還是會出現幻讀的情況。幻讀是指當一個事務A讀取某一個范圍的數據時,另一個事務B在這個范圍插入行,A事務再次讀取這個范圍的數據時,會產生幻讀
  SERIALIZABLE(可串行化): 最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀

mysql 的默認隔離級別是 Repeatable Reads以及背后的原因:
  因為mysql在主從復制的過程是通過bin log 進行數據同步的,而mysql早期只有statement這種bin log格式,這種格式下,bin log記錄的是SQL語句的原文。當出現事務亂序的時候,就會導致備庫在 SQL 回放之后,結果和主庫內容不一致。

  為了解決這個問題,MySQL默認采用了Repetable Read這種隔離級別,因為在RR 中,會在更新數據的時候增加記錄鎖的同時增加間隙鎖。可以避免這種情況的發生

查看數據庫當前的隔離級別命令:

select @@tx_isolation;

RR 和 RC 的區別想要搞清楚這個問題,我們需要先弄清楚 RR 和 RC 的區別,分析下各自的優缺點

一致性讀

  一致性讀,又稱為快照讀。快照即當前行數據之前的歷史版本。快照讀就是使用快照信息顯示基於某個時間點的查詢結果,而不考慮與此同時運行的其他事務所執行的更改。在MySQL 中,只有READ COMMITTED 和 REPEATABLE READ這兩種事務隔離級別才會使用一致性讀。在 RC 中,每次讀取都會重新生成一個快照,總是讀取行的最新版本。在 RR 中,快照會在事務中第一次SELECT語句執行時生成,只有在本事務中對數據進行更改才會更新快照在數據庫的 RC 這種隔離級別中,還支持"半一致讀" ,一條update語句,如果 where 條件匹配到的記錄已經加鎖,那么InnoDB會返回記錄最近提交的版本,由MySQL上層判斷此是否需要真的加鎖。

鎖機制

  數據庫的鎖,在不同的事務隔離級別下,是采用了不同的機制的。在 MySQL 中,有三種類型的鎖,分別是Record Lock、Gap Lock和 Next-Key Lock。

Record Lock表示記錄鎖,鎖的是索引記錄。Gap Lock是間隙鎖,鎖的是索引記錄之間的間隙。Next-Key Lock是Record Lock和Gap Lock的組合,同時鎖索引記錄和間隙。他的范圍是左開右閉的。

  在 RC 中,只會對索引增加Record Lock,不會添加Gap Lock和Next-Key Lock。在 RR 中,為了解決幻讀的問題,在支持Record Lock的同時,還支持Gap Lock和Next-Key Lock;

主從同步

  在數據主從同步時,不同格式的 binlog 也對事務隔離級別有要求。MySQL的binlog主要支持三種格式,分別是statement、row以及mixed,但是,RC 隔離級別只支持row格式的binlog。如果指定了mixed作為 binlog 格式,那么如果使用RC,服務器會自動使用基於row 格式的日志記錄。而 RR 的隔離級別同時支持statement、row以及mixed三種

為什么公司選擇使用 RC?

提升並發

  RC 在加鎖的過程中,是不需要添加Gap Lock和 Next-Key Lock 的,只對要修改的記錄添加行級鎖就行了這就使得並發度要比 RR 高很多。另外,因為 RC 還支持"半一致讀",可以大大的減少了更新語句時行鎖的沖突;對於不滿足更新條件的記錄,可以提前釋放鎖,提升並發度。

減少死鎖

  因為RR這種事務隔離級別會增加Gap Lock和 Next-Key Lock,這就使得鎖的粒度變大,那么就會使得死鎖的概率增大。

死鎖:一個事務鎖住了表A,然后又訪問表B;另一個事務鎖住了表B,然后企圖訪問表A;這時就會互相等待對方釋放鎖,就導致了死鎖。

總結

  主要在加鎖機制、主從同步以及一致性讀方面存在一些差異。為了提升並發度和降低死鎖發生的概率,會把數據庫的隔離級別從默認的 RR 調整成 RC


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM