1. 程式人生 > 其它 >InnoDB儲存引擎 事務隔離機制 MVCC

InnoDB儲存引擎 事務隔離機制 MVCC

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

詳情參見:https://www.cnblogs.com/linhaifeng/articles/14424206.html

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 ?;
"""