mysql默認隔離級別為什么是可重復(fù)讀
[圖片上傳失敗...(image-4b684e-1667551259926)]
1 主服務(wù)器上面的任何操作都會通過自己的 I/O tread(I/O 線程)保存在二進制日志 Binary log 里面捂襟。
2 從服務(wù)器上面也啟動一個 I/O thread,通過配置好的用戶名和密碼, 連接到主服務(wù)器上面請求讀取二進制日志,然后把讀取到的二進制日志寫到本地的一個Realy log(中繼日志)里面柠衅。
3 從服務(wù)器上面同時開啟一個 SQL thread 定時檢查 Realy log(這個文件也是二進制的)趣席,如果發(fā)現(xiàn)有更新立即把更新的內(nèi)容在本機的數(shù)據(jù)庫上面執(zhí)行一遍雷激。(鏈接:http://www.reibang.com/p/faf0127f1cb2)
當(dāng)mysql隔離級別為“讀提交”時
[圖片上傳失敗...(image-489130-1667551259926)]
根據(jù)圖上步驟:
- 先提交session2的新增操作sql,再提交session1:刪除操作
- 由于隔離級別為 讀已提交的姨裸,表示當(dāng)提交后才寫入日志
- 所以日志文件 sql順序: 新增sql 刪除sql;導(dǎo)致從庫去執(zhí)行日志sql文件時悲敷,沒有數(shù)據(jù)
mysql5.1的binlog又提供了兩種格式row、和fixed蹋盆。mysql會根據(jù)情況擇優(yōu)選擇使用哪種格式费薄。就算是這樣也不能避免主從不一致的問題。就像前面的例子如果刪除大量數(shù)據(jù)的時候保存binlog日志采用statement格式栖雾,未提交楞抡;插入大量數(shù)據(jù)的時候也采用了statement。(為什么采用statement格式析藕,可看推薦文章《mysql主服務(wù)器 binlog_format 的 statement,row, mixed 三種格式對比召廷。》)账胧,那么就可能造成主從不一致的問題竞慢。只有將修改的語句串行化才能解決這個問題。將隔離級別提升為可重復(fù)讀就能將寫入binlog的語句串行化找爱。從庫是根據(jù)binlog日志執(zhí)行了的梗顺。binlog保證了與主庫相同的執(zhí)行順序泡孩,那么也就保證了主從的一致性车摄。
當(dāng)mysql默認隔離級別為可重復(fù)讀時
[圖片上傳失敗...(image-9d6bb1-1667551259926)]
離級別設(shè)為可重復(fù)讀(Repeatable Read),在該隔離級別下引入間隙鎖。當(dāng)Session 1執(zhí)行delete語句時仑鸥,會鎖住間隙吮播。那么,Ssession 2執(zhí)行插入語句就會阻塞住眼俊,無法繼續(xù)執(zhí)行意狠。只有到session1 提交(commit)了之后。才能執(zhí)行疮胖。實現(xiàn)了寫入binlog的語句串行化环戈。解決了主從不一致的問題闷板。
總結(jié)
MySQL使用可重復(fù)讀來作為默認隔離級別的主要原因是語句級的Binlog≡喝可重復(fù)讀能提供SQL語句的寫可串行化遮晚,保證了主從一致。