【mysql】關於innodb中MVCC的一些理解
一、MVCC簡介
MVCC (Multiversion Concurrency Control),即多版本併發控制技術,它使得大部分支援行鎖的事務引擎,不再單純的使用行鎖來進行資料庫的併發控制,取而代之的是把資料庫的行鎖與行的多個版本結合起來,只需要很小的開銷,就可以實現非鎖定讀,從而大大提高資料庫系統的併發效能
讀鎖:也叫共享鎖、S鎖,若事務T對資料物件A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S 鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
寫鎖:又稱排他鎖、X鎖。若事務T對資料物件A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。
表鎖:操作物件是資料表。Mysql大多數鎖策略都支援(常見mysql innodb),是系統開銷最低但併發性最低的一個鎖策略。事務t對整個表加讀鎖,則其他事務可讀不可寫,若加寫鎖,則其他事務增刪改都不行。
行級鎖:操作物件是資料表中的一行。是MVCC技術用的比較多的,但在MYISAM用不了,行級鎖用mysql的儲存引擎實現而不是mysql伺服器。但行級鎖對系統開銷較大,處理高併發較好。
二、MVCC實現原理
innodb MVCC主要是為Repeatable-Read事務隔離級別做的。在此隔離級別下,A、B客戶端所示的資料相互隔離,互相更新不可見
瞭解innodb的行結構、Read-View的結構對於理解innodb mvcc的實現由重要意義
innodb儲存的最基本row中包含一些額外的儲存資訊 DATA_TRX_ID,DATA_ROLL_PTR,DB_ROW_ID,DELETE BIT
-
6位元組的DATA_TRX_ID 標記了最新更新這條行記錄的transaction id,每處理一個事務,其值自動+1
-
7位元組的DATA_ROLL_PTR 指向當前記錄項的rollback segment的undo log記錄,找之前版本的資料就是通過這個指標
- 6位元組的DB_ROW_ID,當由innodb自動產生聚集索引時,聚集索引包括這個DB_ROW_ID的值,否則聚集索引中不包括這個值.,這個用於索引當中
-
DELETE BIT位用於標識該記錄是否被刪除,這裡的不是真正的刪除資料,而是標誌出來的刪除。真正意義的刪除是在commit的時候
具體的執行過程
begin->用排他鎖鎖定該行->記錄redo log->記錄undo log->修改當前行的值,寫事務編號,回滾指標指向undo log中的修改前的行
上述過程確切地說是描述了UPDATE的事務過程,其實undo log分insert和update undo log,因為insert時,原始的資料並不存在,所以回滾時把insert undo log丟棄即可,而update undo log則必須遵守上述過程
下面分別以select、delete、 insert、 update語句來說明
SELECT
Innodb檢查每行資料,確保他們符合兩個標準:
1、InnoDB只查詢版本早於當前事務版本的資料行(也就是資料行的版本必須小於等於事務的版本),這確保當前事務讀取的行都是事務之前已經存在的,或者是由當前事務建立或修改的行
2、行的刪除操作的版本一定是未定義的或者大於當前事務的版本號,確定了當前事務開始之前,行沒有被刪除
符合了以上兩點則返回查詢結果。
INSERT
InnoDB為每個新增行記錄當前系統版本號作為建立ID。
DELETE
InnoDB為每個刪除行的記錄當前系統版本號作為行的刪除ID。
UPDATE
InnoDB複製了一行。這個新行的版本號使用了系統版本號。它也把系統版本號作為了刪除行的版本。
說明
insert操作時 “建立時間”=DB_ROW_ID,這時,“刪除時間 ”是未定義的;
update時,複製新增行的“建立時間”=DB_ROW_ID,刪除時間未定義,舊資料行“建立時間”不變,刪除時間=該事務的DB_ROW_ID;
delete操作,相應資料行的“建立時間”不變,刪除時間=該事務的DB_ROW_ID;
select操作對兩者都不修改,只讀相應的資料
三、對於MVCC的總結
上述更新前建立undo log,根據各種策略讀取時非阻塞就是MVCC,undo log中的行就是MVCC中的多版本,這個可能與我們所理解的MVCC有較大的出入,一般我們認為MVCC有下面幾個特點:- 每行資料都存在一個版本,每次資料更新時都更新該版本
- 修改時Copy出當前版本隨意修改,各個事務之間無干擾
- 儲存時比較版本號,如果成功(commit),則覆蓋原記錄;失敗則放棄copy(rollback)
- 事務以排他鎖的形式修改原始資料
- 把修改前的資料存放於undo log,通過回滾指標與主資料關聯
- 修改成功(commit)啥都不做,失敗則恢復undo log中的資料(rollback)
參考文章
https://www.percona.com/blog/2014/12/17/innodbs-multi-versioning-handling-can-be-achilles-heel/
http://www.xdata.me/?p=289
http://blogread.cn/it/article/5969
http://blog.csdn.net/chen77716/article/details/6742128
http://blog.chinaunix.net/link.php?url=http://forge.mysql.com%2Fwiki%2FMySQL_Internals
相關推薦
【MySQL】centOS中安裝和配置MySQL
在MySQL的官方網站下載rpm包,地址為https://dev.mysql.com/downloads/repo/yum/ 也可以使用wget來下載 地址可以在網上找 然後輸入rpm -Uvh mysql57-community-release-el7-10.noarch.rpm
【Mysql】trigger觸發器(一些例項)
簡述 搞這個,主要是因為在網上根本沒找到mysql在這方面的太多資料。 所以,自己搞個筆記。 立個flag,如果遇到,或者試出來什麼比較好用的trigger的操作。就過來這個存起來 文章目錄 簡述 建立 不滿足條件就不修
【MySQL】InnoDB 記憶體管理機制 --- Buffer Pool
InnoDB Buffer Pool 是一塊連續的記憶體,用來儲存訪問過的資料頁面 innodb_buffer_pool_size 引數用來定義 innodb 的 buffer pool 的大小 是 MySQL 中擁有最大的記憶體的模組 Innodb 中,資料的訪問是按照頁/塊(預設為16
【Spark】--Spark中RDD的理解
1.什麼是RDD?RDD:RDD是Spark的計算模型 RDD(Resilient Distributed Dataset)叫做彈性的分散式資料集合,是Spark中最基本的資料抽象,它代表一個不可變、只讀的,被分割槽的資料集。操作RDD就像操作本地集合一樣,資料會被分散到多臺
【PB】PowerBuilder中的一些不太常用的方法
25、Shutdown from application [PB external function declaration] FUNCTION boolean ExitWindowsEx(ulong uFlags, long dwReserved ) & LIBRARY 'user32.dll' [
對Innodb中MVCC的理解
一、什麼是MVCC MVCC (Multiversion Concurrency Control) 中文全程叫多版本併發控制,是現代資料庫(如MySql)引擎實現中常用的處理讀寫衝突的手段,目的在於提高資料庫高併發場景下的吞吐效能。 MySQL的InnoDB儲存引擎預設事務隔離級別是RR(可
【mysql】關於innodb中MVCC的一些理解
一、MVCC簡介 MVCC (Multiversion Concurrency Control),即多版本併發控制技術,它使得大部分支援行鎖的事務引擎,不再單純的使用行鎖來進行資料庫的併發控制,取而代之的是把資料庫的行鎖與行的多個版本結合起來,只需要很小的開銷,就可以實現非鎖定讀,從而大大提高資料庫系統的併
關於innodb中MVCC的一些理解
一、MVCC簡介 MVCC (Multiversion Concurrency Control),即多版本併發控制技術,它使得大部分支援行鎖的事務引擎,不再單純的使用行鎖來進行資料庫的併發控制,取而代之的是把資料庫的行鎖與行的多個版本結合起來,只需要很小的開銷,就可以實現非鎖定讀,從而大大提高資
【MySQL】如何解決MySQL中查詢不區分大小寫的問題
bsp title 標識 article ble 問題 col bold table mysql查詢默認是不區分大小寫的 如: select * from some_table where str=‘abc‘; select * from some_ta
【MySQL】【復制】利用slave_exec_mode處理復制過程中出現的1062與1032錯誤
cati 事務 thead 組成 .cn 推薦 ren 報錯 引入 背景: ? 今天張師兄在群裏問了主從之間出現1032錯誤後,使用pt-slave-restart跳過後又出現了1062錯誤,該如何快速處理。 問題解析: ? 1032錯誤:主庫傳遞過來的binlog
【轉載】Python 中的 if __name__ == '__main__' 該如何理解
一個 知識 如果 協程 運行 pat 執行 開始 參考資料 轉自 曠世的憂傷 http://blog.konghy.cn/2017/04/24/python-entry-program/ 程序入口 對於很多編程語言來說,程序都必須要有一個入口,比如 C,C++,以及完全面向
【轉】Python中操作mysql的pymysql模塊詳解
定義 padding 參數化查詢 finall 支持 順序 執行sql mysq syntax Python中操作mysql的pymysql模塊詳解 前言 pymsql是Python中操作MySQL的模塊,其使用方法和MySQLdb幾乎相同。但目前pymysql支持p
【轉】C#中Func與Action的理解
.net ring UNC 簡單 代碼 操作 不必要 返回值 tps 原文地址:https://www.cnblogs.com/ultimateWorld/p/5608122.html Action 與 Func是.NET類庫中增加的內置委托,以便更加簡潔方便的使用委托。最
【mybatis】mybatis中insert 主鍵自增和不自增的插入情況【mysql】
pro SQ class TE IV rop generate mys bat 主鍵不自增:返回值是插入的條數 <insert id="add" parameterType="EStudent"> insert into TStudent(name,
【轉】【MySQL】MySQL中的鎖(表鎖、行鎖,共享鎖,排它鎖,間隙鎖)
https://blog.csdn.net/soonfly/article/details/70238902 本文參考: http://mysqlpub.com/thread-5383-1-1.html http://blog.csdn.net/c466254931/ar
【mysql】在mysql中更新欄位的部分值,更新某個字串欄位的部分內容
在mysql中更新欄位的部分值,更新某個字串欄位的部分內容 sql語句如下: update goods set img = REPLACE(img,'http://ozwm3lwui.bkt.clouddn.com','http://imgs.lqjava.com') where
【Untiy3d-編輯器相關1】Unity中的一些特殊的資料夾
1.Editor(只要叫這個名字的資料夾,可以存在多個) 叫這名字的資料夾下所有資原始檔和指令碼檔案都不會被打到包中。指令碼也只有編輯時候能用。編輯器相關的資源可以放入此檔案中; 2.Editor Default Resources(Assets下根目錄) 不會打包到包
【mysql】--MVCC 多版本控制
InnoDB的mvcc,是通過在每行記錄後面儲存兩個隱藏的列來實現的。這兩個列,一個儲存了行的建立時間,一個儲存行的過期時間(刪除時間)。儲存的並不是實際的時間,而是系統版本號。每一個新的事物,系統版本號都會遞增。 事物開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比
【mysql】資料庫隔離級別read committed && MVCC
前言 可以很負責任的跟大家說,MySQL 中的此隔離級別不單單是通過加鎖實現的,實際上還有repeatable read 隔離級別,其實這兩個隔離級別效果的實現還需要一個輔助,這個輔助就是MVCC-多版本併發控制,但其實它又不是嚴格意義上的多版本併發控制,是不是很懵,沒關
【MySQL】——MySQL中的鎖機制
概述 相對其他資料庫來說,MySQL的鎖機制比較簡單,不同的儲存引擎支援不同的鎖機制。 MySQL大致可以分為以下3種鎖 表級鎖:操作物件是資料表。MySQL大多數鎖策略都支援,開銷小,加鎖快。不會出現死鎖。鎖定粒度大,發生鎖衝突的概率最高,併發度最低。