表鎖和行鎖的區別
mysql的表級鎖有兩種:元資料鎖和表鎖。
表鎖的兩種形式:
元資料鎖:
mysql的行級鎖是有儲存引擎實現的,mysql現在預設的資料引擎為innodb。本文主要介紹innodb的行鎖;按照範圍來說innodb的行鎖是給索引項加鎖實現的,也就意味著只有使用索引檢索的資料才能使用行鎖,否則將使用表鎖。
按照功能來說
對於innodb來說,會自動給增刪改語句新增排它鎖,x鎖。對於普通的查詢語句不會新增任何鎖。意向鎖
innodb同樣也實現了表級鎖,也就是意向鎖。意向鎖是mysql內部使用的,不需要使用者去干預。
意向和行鎖可以共存,意向鎖的作用是為了提公升全表更新資料時的效能提公升,否則在更新全表時要檢索哪些資料行上有行鎖。
間隙鎖顧名思義,主要是在記錄之間新增鎖,不允許往間隙插入資料。比如id為 2 4,那此時使用間隙鎖就會鎖2 3 4 這三個,稍後在介紹事務的時候也會再次介紹間隙鎖,間隙鎖的主要作用就是為了解決幻讀問題。此處先了解一下。
死鎖mysql的死鎖和我們**中死鎖理論是一樣的,不同的是,mysql指的是兩個不同的連線互相等待對方釋放鎖,才能釋放自己持有的資源,所以造成了死鎖。mysql中也有對死鎖的優化。我們稍後再具體說。
接下來我們開始介紹事務,上面只是簡單介紹了一下鎖的基本概念,鎖還有一部分內容需要結合事務來理解,所以稍後還有鎖的介紹。innodb的磁碟檔案在我們介紹事務之前,我們先聊一下innodb的架構,事務中的一些部分會涉及到這部分的內容。
使用者表空間
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來設定
屬性值為0時,事務提交,不會對redo進行寫入操作,等待主線程按時寫入;
屬性值為1時,事務提交,將資料寫入磁碟,確保不會出現資料丟失;
屬性值為2時,事務提交,將資料寫入系統快取,讓檔案系統自己判斷什麼時候寫入磁碟。
預設值為1,一般也建議設定為1,會保證資料的安全性,並且只有為1的時候才會保證事務的一致性。
MySql儲存引擎InnoDB的鎖
innodb實現了以下兩種型別的行鎖 共享鎖 s 允許乙個事務去讀一行,阻止其他事務獲得相同的資料集的排他鎖。排他鎖 x 允許獲得排他鎖的事務更新資料,阻止其他事務獲得相同資料集的共享鎖和排他鎖。共享鎖就是我讀的時候,你可以讀,但是不能寫。排他鎖就是我寫的時候,你不能讀也不能寫。另外,為了允許行鎖和...
Mysql中InnoDB引擎的鎖
鎖這種機制的作用 對共享資源併發訪問的管理,保證資料的完整性和一致性。在資料庫中,lock與latch都可以被稱為 鎖 但是兩者的含義是完全不同的。lock針對的物件是事務,它用來鎖定資料庫中的物件,如表 頁 行。一般lock的物件僅在事務commit或者rollback後進行釋放,並且lock是有...
MySQL鎖之 InnoDB儲存引擎及其鎖機制
首先要解決的乙個誤區就是 innodb儲存引擎是基於事務的。而前面博文所講的myisam儲存引擎是不支援事務的。那麼什麼是基於事務的呢?複製過來一段我覺得講得還不錯的話 在預設的情況下,mysql 從自動提交 autocommit 模式執行,這種模式會在每條語句執行完畢後把它作出的修改立刻提交給資料...