《高效能MySQL》讀書筆記 多版本併發控制演算法

2021-07-02 00:46:37 字數 2269 閱讀 2668

mysql採用預設自動提交,可以通過如下命令檢視和修改:

mysql> show variables like 'autocommit';

+---------------+-------+

| variable_name | value |

+---------------+-------+

| autocommit | on |

+---------------+-------+

1 row in set (0.00 sec)

mysql> set autocommit = 1;

innodb在開啟事務時,獲取隱式鎖,在事務提交或者回滾時釋放鎖,innodb根據隔離級別在需要的時候自動加鎖。

但innodb也支援顯式鎖:

select ... for update

select ... lock in share mode

這是在伺服器層實現的,和儲存引擎無關。本書建議除了禁用了autocommit,可以使用lock_tables之外,其他任何時候都不要顯示地執行lock tables,不管使用的是什麼儲存引擎。

第一點:

mvcc並不是mysql獨有的,oracle,postgresql等都在使用。

mvcc並沒有簡單地使用行鎖,而是使用「行級別鎖」(row-level locking)。

mvcc的基本原理是:

mvcc的實現,通過儲存資料在某個時間點的快照來實現的。這意味著乙個事務無論執行多長時間,在同乙個事務裡能夠看到資料一致的檢視。根據事務開始的時間不同,同時也意味著在同乙個時刻不同事務看到的相同表裡的資料可能是不同的。

mvcc的基本特徵:

innodb儲存引擎mvcc的實現策略:

在每一行資料中額外儲存兩個隱藏的列:當前行建立時的版本號和刪除時的版本號(可能為空)。這裡的版本號並不是實際的時間值,而是系統版本號。每開始 個新的事務,系統版本號都會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢每行記錄的版本號進行比較。

每個事務又有自己的版本號,這樣事務內執行crud操作時,就通過版本號的比較來達到資料版本控制的目的。  

mvcc具體的操作如下:

select:innodb會根據以下兩個條件檢查每行記錄:

1)innodb只查詢版本早於當前事務版本的資料行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務讀取的行,只麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的。

2)行的刪除版本要麼未定義,要麼大於當前事務版本號。這可以確保事務讀取到的行,在事務開始之前未被刪除。

只有1和2同時滿足的記錄,才能做為查詢結果。

insert:innodb為新插入的每一行儲存當前系統版本號作為行版本號。

delete:innodb為刪除的每一行儲存當前系統版本號作為行刪除標識。

update:innodb為插入一行新記錄,儲存當前系統版本號作為行版本號,同時儲存當系統的版本號為原來的行作為刪除標識。

儲存這兩個額外系統版本號,使大多數操作都可以不用加鎖。這樣設計使得計資料操作很簡單,效能很好,並且也能保證只會讀取到符合標準的行。不足之處是每行記錄都需要額外的儲存空間,需要做更多的行檢查工作,以及一些額外的維護工作。

mvcc只在repeatable read和read commited兩個隔離級別下工作,其它兩個隔離級別和mvcc不相容。

innodb的實現算不上mvcc,因為並沒有實現核心的多版本共存,undo log中的內容只是序列化的結果,記錄了多個事務的過程,不屬於多版本共存。但理想的mvcc是難以實現的,當事務僅修改一行記錄使用理想的mvcc模式是沒有問題的,可以通過比較版本號進行回滾;但當事務影響到多行資料時,理想的mvcc據無能為力了。

比如,如果transaciton1執行理想的mvcc,修改row1成功,而修改row2失敗,此時需要回滾row1,但因為row1沒有被鎖定,其資料可能又被transaction2所修改,如果此時回滾row1的內容,則會破壞transaction2的修改結果,導致transaction2違反acid。

理想mvcc難以實現的根本原因在於企圖通過樂觀鎖代替二段提交。修改兩行資料,但為了保證其一致性,與修改兩個分布式系統中的資料並無區別,而二段提交是目前這種場景保證一致性的唯一手段。二段提交的本質是鎖定,樂觀鎖的本質是消除鎖定,二者矛盾,故理想的mvcc難以真正在實際中被應用,innodb只是借了mvcc這個名字,提供了讀的非阻塞而已。

mysql重點:《高性

能mysql》讀書筆記--索引

高效能MySQL 讀書筆記

第4章 schema與資料型別優化 第5章 建立高效能的索引 三星索引 最左匹配原則 高效能索引策略 多列索引 mysql採用的是分層架構 上層是server層,下層是儲存引擎層。sql標準中定義了四種隔離級別 隔離級別 定義髒讀 不可重複讀 幻讀加鎖讀 讀未提交 read uncommitted,...

高效能Mysql 讀書筆記

mysql與眾不同的特性是它的儲存引擎架構,這種架構將查詢處理即其他的任務系統和資料的儲存 提取相分離.第二層架構中,大多數的mysql的核心服務功能都在這一層,包括查詢解析,分析優化,快取以及所處的內建函式,所有的跨儲存引擎的功能都在這一層實現 儲存過程,觸發器,檢視等.第三層包含mysql的儲存...

高效能mysql讀書筆記1

譯者序言 本書的定位 系統的從各個方面講述乙個高效能mysq應用應該怎麼做,區別於市面上那些關於mysql開發書籍只是停留在學習mysql基本語句,本書提供了作者一些mysql調優的基準測試從而幫助理解mysql內部的工作機制,本書強調mysql的可用性 準確性以及效能。本書根據mysql5.0穩定...