mysql的鎖是面試中很高頻問題,也是咱們在平常開發中常常會遇到可是咱們並無注意到的地方。我把我本身理解的鎖經過本篇博文分享出來,因爲鎖須要結合事務來理解,本文只介紹鎖的基本概念,一樣爲了理解事務會更加深入,先介紹了InnoDB的一些基礎概念,也是記錄本身的學習,歡迎你們一塊兒探討交流。mysql
下一篇:mysql的事務與mvcc面試
按照鎖的粒度來分sql
表鎖和行鎖的區別數據庫
mysql的表級鎖有兩種:元數據鎖和表鎖。緩存
表鎖的兩種形式:安全
表共享讀鎖架構
表排它寫鎖併發
手動加表鎖mvc
lock table tableName read;
複製代碼
查看錶鎖狀況性能
show open tables;
複製代碼
刪除表鎖
unlock tables;
複製代碼
元數據鎖:
mysql的行級鎖是有存儲引擎實現的,mysql如今默認的數據引擎爲Innodb。本文主要介紹InnoDB的行鎖;
InnoDB的行鎖是給索引項加鎖實現的,也就意味着只有使用索引檢索的數據才能使用行鎖,不然將使用表鎖。
對於InnoDB來講,會自動給增刪改語句添加排它鎖,X鎖。對於普通的查詢語句不會添加任何鎖。
InnoDB一樣也實現了表級鎖,也就是意向鎖。意向鎖是mysql內部使用的,不須要用戶去幹預。
意向和行鎖能夠共存,意向鎖的做用是爲了提高全表更新數據時的性能提高,不然在更新全表時要檢索哪些數據行上有行鎖。
顧名思義,主要是在記錄之間添加鎖,不容許往間隙插入數據。好比id爲 2 4,那此時使用間隙鎖就會鎖2 3 4 這三個,稍後在介紹事務的時候也會再次介紹間隙鎖,間隙鎖的主要做用就是爲了解決幻讀問題。此處先了解一下。
mysql的死鎖和咱們代碼中死鎖理論是同樣的,不一樣的是,mysql指的是兩個不一樣的鏈接互相等待對方釋放鎖,才能釋放本身持有的資源,因此形成了死鎖。mysql中也有對死鎖的優化。咱們稍後再具體說。
接下來咱們開始介紹事務,上面只是簡單介紹了一下鎖的基本概念,鎖還有一部份內容須要結合事務來理解,因此稍後還有鎖的介紹。
在咱們介紹事務以前,咱們先聊一下InnoDB的架構,事務中的一些部分會涉及到這部分的內容。
系統表空間
用戶表空間
InnoDB數據落盤有圖能夠看出來是經過兩種方式來實現的
經過兩種方式來落盤,也能夠理解爲持久化到磁盤上。是爲了保證數庫發生忽然宕機,形成數據丟失。
髒頁落盤會產生IO而且是隨機寫入,耗時比較長。頻繁進行磁盤IO對性能損耗是很是大。而且數據的安全性得不到保障。若是在髒頁數據還沒來得及落盤或者落盤過程出現宕機,那麼數據就會丟失。
鑑於以上狀況,mysql用雙保險完成數據的安全性,髒頁落盤是一種,另外一種就是預寫redo 日誌,首先咱們要知道redo 持久化到磁盤是順序寫入,順序寫入的速度要比隨機寫入要快,此時有朋友就會問,那髒頁落盤爲何不採用順序寫入呢但?
順序寫入速度快的同時是會產生磁盤碎片的,磁盤碎片會大大浪費磁盤資源。
redo 日誌持久化的時機是在事務提交時寫入到磁盤的redo file中,此時髒頁數據並不必定完成了落盤,髒頁落盤是由checkPoint檢查點機制控制的,咱們這裏不展開多說。
數據庫發生宕機的狀況:
有的朋友還會說,那redo log file的數據豈不是無限大?
ib_logfile0,ib_logfile1 這是rodo log 在咱們磁盤上的命名,能夠看到有兩個文件,採用的循環寫入的方式,若是1滿了就寫入2,2滿了寫入1,這樣循環。
redo 日誌持久化到磁盤也是能夠配置的,經過InnoDB的innodb_push_log_at_trx_commit來設置
默認值爲1,通常也建議設置爲1,會保證數據的安全性,而且只有爲1的時候纔會保證事務的一致性。
下一篇:mysql的事務和mvcc