InnoDB儲存引擎 事務隔離機制 MVCC
阿新 • • 發佈:2021-06-10
1、InnoDB儲存引擎
""" 前文我們提到過InnoDB支援行鎖(鎖定欄位含有索引的情況下,否則走表鎖),但鎖定方式並非簡單的鎖定指定行上的索引,而是分為3種鎖定演算法: 1)記錄鎖(Record Locks):鎖定指定行的索引項 2)Gap Locks:鎖定某一個範圍內的索引,但不包括記錄本身 3)間隙鎖定(Next-Key Locks):鎖定一個範圍內的索引,並且鎖定記錄本身 Next-Key Locks = Record Locks + Gap Locks A next-key lock is a combination of a record lock on the index record and a gap lock on the gap before the index record 而InnoDB 儲存引擎預設隔離級別為可重複讀(Repeatable Read),該隔離級別下,對於索引的查詢採用 next-key locks。這樣做避免了幻讀現象的產生。"""
2、事務隔離機制
詳情參見:https://www.cnblogs.com/linhaifeng/articles/14387903.html#_label4
""" 事務具有原子性、一致性、隔離性、永續性四大特性,而隔離性顧名思義指的就是事務彼此之間隔離開,多個事務在同時處理一個數據時彼此之間互相不影響,
如如果隔離的不夠好就有可能會產生髒讀、不可重複度、幻讀等讀現象,為此,隔離性總共分為四種級別 由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。"""
需要強調的是:我們確實可以採用提高事務的隔離級別的方式來解決髒讀、不可重複讀、幻讀等問題,但與此同時,事務的隔離級別越高,併發能力也就越低。所以,還需要讀者根據業務需要進行權衡。
""" 解決: 髒讀 不可重複讀 幻讀 方案: RR機制+innodb儲存引擎的Next-key lock行級鎖演算法 """
""" Repeatable Reads機制是MySQL預設事務隔離機制,解決了幻讀的情況,但存在髒讀和不可重複讀的問題,通過innodb儲存引擎內部的next-key lock來解決剩下兩種讀現象的問題。 """
""" 瞭解 事務在讀取某資料的瞬間(開始讀的瞬間),必須對其加行級共享鎖,直到事務結束才釋放,事務在更新某資料的瞬間(發生更新的瞬間),必須對其新增排它鎖,直到事務結束才釋放"""
3、MVCC
""" MVCC (Multiversion Concurrency Control),即多版本併發控制技術,它使得大部分支援行鎖的事務引擎,不再單純的使用行鎖來進行資料庫的併發控制,
取而代之的是,把資料庫的行鎖與行的多個版本結合起來,只需要很小的開銷,就可以實現非鎖定讀,從而大大提高資料庫系統的併發效能. """
快照讀和當前讀
""" 在MVCC併發控制中,讀操作可以分成兩類:快照讀 (snapshot read)與當前讀 (current read)。快照讀,讀取的是記錄的可見版本 (有可能是歷史版本),不用加鎖。
當前讀,讀取的是記錄的最新版本,並且,當前讀返回的記錄,都會加上鎖,保證其他事務不會再併發修改這條記錄。 在一個支援MVCC併發控制的系統中,哪些讀操作是快照讀?哪些操作又是當前讀呢?以MySQL InnoDB為例: """
快照讀
""" 簡單的select操作,屬於快照讀,不加鎖。(當然,也有例外,進一步瞭解,請點選https://www.cnblogs.com/crazylqy/p/7611069.html) select * from table where ?; """
當前讀
""" 特殊的讀操作,插入/更新/刪除操作,屬於當前讀,需要加鎖。 select * from table where ? lock in share mode; select * from table where ? for update; insert into table values (…); update table set ? where ?; delete from table where ?; """