Mysql Innodb LBCC详解
什么是存儲引擎?
存儲引擎可理解為對磁盤的操作方式,是一套存儲數(shù)據(jù)的規(guī)范,Mysql是一個插拔式的存儲引擎。默認的Innodb并不是由Mysql團隊研發(fā),而是由第三方公司研發(fā)產(chǎn)生。它的最重要作用是修飾表,每個表也可以用不同的存儲引擎來修飾。Innodb優(yōu)秀的設計使得Mysql5.5之后的版本默認使用Innodb引擎
事務概述
隔離性:事務是一組不可分割的操作集合。破壞事務隔離性是由數(shù)據(jù)并發(fā)訪問導致,破壞事務隔離性導致的臟讀,幻讀,不可重復讀三個問題。使用四種事務隔離級別解決這些問題,具體機制是Mvcc機制與LBcc機制。
原子性:關注是語句的執(zhí)行狀態(tài),當發(fā)生事務內部故障會破壞原子性,保證原子性的機制是,UNDO log反向掃描日志,撤銷已做的更新操作
Mysql默認設置會話級別的自動提交,即執(zhí)行一條語句會自動提交事務,無法做到原子性保證。故我們要將多條語句變成一個事務的話需要關閉自動提交,設置為手動提交。
一致性:并發(fā)訪問的可見性設定,關注的是數(shù)據(jù)的一致,當發(fā)生系統(tǒng)故障如:系統(tǒng)斷電,DBMS代碼錯誤時,這些情況可能會導致未完成的事務對數(shù)據(jù)庫的更新肯已經(jīng)寫入數(shù)據(jù)庫,已經(jīng)完成的事務對數(shù)據(jù)庫的更新停留在緩沖區(qū)沒來得及寫入數(shù)據(jù)庫。這都會破獲一致性,解決方法是UNDO LOG+REDO LOG反向掃描日志撤銷未完成的事務,正向掃描日志,找出故障發(fā)生前已經(jīng)提交的事務進行重做
持久性:事務對數(shù)據(jù)庫的改變應該是永久的,發(fā)生介質故障如磁盤損壞,會破壞持久性.解決方法是重裝數(shù)據(jù)庫(裝入最新的數(shù)據(jù)庫后備副本),然后REDO LOG+UNDO LOG
隔離級別
sql92 標準四種隔離級別:
Read Uncommitted 解決并發(fā)問題
Read Committed 解決臟讀問題
Repeatable Read 解決不可重復讀問題
Serializable 解決所有問題
Innodb默認的隔離級別是RR(Repeatable Read)級別,但是卻解決了幻讀問題,這便是Innodb的優(yōu)秀之處
Innodb如何解決隔離性問題,即如何實現(xiàn)事務隔離級別?
1、利用鎖的互斥性----->LBCC當前讀 (悲觀鎖)
(Lock Based Concurrency Control)基于數(shù)據(jù)庫當前版本的讀寫
如:update,delete ,insert,select * from table where id=1 lock in share mode(當前讀)
2、多版本控制----->MVCC快照讀(復制的多一份數(shù)據(jù))(樂觀鎖)
(MultiVersion Concurrency Control)讀取的是數(shù)據(jù)庫歷史版本,讀取歷史版本還有意義嗎?其實快照讀的歷史版本是在數(shù)據(jù)修改時才生成的副本,并不是連續(xù)修改之前的版本,是一次修改之前的版本,即讀取最新版本,也就保證了數(shù)據(jù)的正確性
如:select * from table where id=1(快照讀)
Innodb的LBCC機制的具體實現(xiàn)
1、鎖的分類
加排他鎖(x):事務結束釋放,不能加其他鎖
delecte/update/insert默認
select * from where … for update
加共享鎖(s):事務結束釋放,可繼續(xù)加共享鎖,不能加排他鎖
select * from where … lock in share mode
1、Innonb的行鎖機制是在索引項上加鎖實現(xiàn),故若通過索引條件(where)進行檢索,Innodb會鎖住行,否則鎖住整張表。
2、Innodb按照輔助索引(二級索引)進行檢索時,輔助索引項和主鍵索引項都將被鎖定,即是鎖住行
2、行鎖的具體實現(xiàn)
臨鍵鎖:
next-key(gap+lock):適用于范圍查找,當在查詢范圍命中索引項時,會鎖住當前索引項和索引項的下一個左開右閉區(qū)間。Innodb的默認行鎖算法,巧妙解決幻讀問題,而幻讀產(chǎn)生原因是范圍查找時其他線程在查找的范圍內插入了數(shù)據(jù),導致兩次查找的范圍結果不一樣。使用臨建鎖之后,會鎖住以關鍵字以及關鍵字的下一個區(qū)間,從而其他線程無法插入數(shù)據(jù),解決幻讀。
Innodb引擎默認推薦使用主鍵自增序列方式,也是為了解決幻讀,因為插入數(shù)據(jù),主鍵必然會自增長,此時增長的記錄被鎖住了,無法插入
間隙鎖:
gap lock : 當記錄不存在,會從臨建鎖退化成間隙鎖,會鎖住記錄不存在的左開右開區(qū)間
記錄鎖:
record lock:當命中記錄,退化成Record鎖,鎖住記錄所在行
?
總結
以上是生活随笔為你收集整理的Mysql Innodb LBCC详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么国内SaaS很难爆发
- 下一篇: linux cmake编译源码,linu