MySql雖然是一個相對簡單的關系型數據庫,但也是一個最常用的數據庫,也是一個非常經典的數據庫,很多云產品也是基于MySql做了二開,從而變得非常強大,其中MySql最常用的是Innodb引擎,因為該引擎支持事務,行級鎖等特性,從而使其非常適用于業務開發的場景。
MySql的知識體系其實很龐大,真要完全吃透其實非常復雜,而且很多知識點也容易忘記或者沒理解透,但是,想要用好MySql就必須加強對它相關知識的記憶,其實很多人都或多或少見過這些知識點,甚至曾經也都記得,但是當一段時間過去,可能對這些知識點又產生了一層朦朧,本人亦如此,現在,將展開對此回顧:
在Innodb中:
當在RC和RR的isolation下,凡是SELECT xx FROM xx (WHERE xx)是快照讀,不加任何鎖,而只要是添加S鎖或者X鎖,都會產生當前讀,凡是不生產鎖的就是快照讀,產生的鎖的都是當前讀;
RU/SERIALIZE的isolution下全部使用當前讀,其中串行化級別下的普通SELECT都會默認在尾部追加S鎖以此來實現當前讀。
RC 和 RR 隔離級別都是由 MVCC 實現,區別在于:
- RC 隔離級別時,read-view 是每次執行 select 語句時都生成一個;
- RR 隔離級別時,read-view 是在第一次執行 select 語句時生成一個。
需要注意的是...IN SHARE MODE、...FOR UPDATE、INSERT、UPDATE、DELETE等觸發鎖的行為一定要走索引,不然會導致鎖表,其實范圍查詢時若命中紀錄為空,這種情況即使走索引列也會認為未走索引而鎖表