資料庫mvvc的簡單理解

2022-04-29 13:33:09 字數 2621 閱讀 8416

先說下我自己的理解,總結為圖如下:

mvcc的全稱是「多版本併發控制」。這項技術使得innodb的事務隔離級別下執行一致性讀操作有了保證,換言之,就是為了查詢一些正在被另乙個事務更新的行,並且可以看到它們被更新之前的值。這是乙個可以用來增強併發性的強大的技術,因為這樣的一來的話查詢就不用等待另乙個事務釋放鎖。這項技術在資料庫領域並不是普遍使用的。一些其它的資料庫產品,以及mysql其它的儲存引擎並不支援它。

mysql的innodb採用的是行鎖,而且採用了多版本併發控制來提高讀操作的效能。

什麼是多版本併發控制呢 ?其實就是在每一行記錄的後面增加兩個隱藏列,記錄建立版本號和刪除版本號,

而每乙個事務在啟動的時候,都有乙個唯一的遞增的版本號。 

在innodb中,給每行增加兩個隱藏欄位來實現mvcc,兩個列都用來儲存事務的版本號,每開啟乙個新事務,事務的版本號就會遞增。

於是乎,預設的隔離級別(repeatable read)下,增刪查改變成了這樣:

insert

update

delete

在插入操作時 : 記錄的建立版本號就是事務版本號。 

比如我插入一條記錄, 事務id 假設是1 ,那麼記錄如下:也就是說,建立版本號就是事務版本號。

idname

create version

delete version

1xttblog

1在更新操作的時候,採用的是先標記舊的那行記錄為已刪除,並且刪除版本號是事務版本號,然後插入一行新的記錄的方式。 

比如,針對上面那行記錄,事務id為2 要把name欄位更新。

updatetablesetname='new_value'whereid=1;

idname

create version

delete version

1xttblog12

1xttblog.com

2刪除操作的時候,就把事務版本號作為刪除版本號。比如:

deletefromtablewhereid=1;

idname

create version

delete version

1xttblog.com23

查詢操作:從上面的描述可以看到,在查詢時要符合以下兩個條件的記錄才能被事務查詢出來: 

刪除版本號 大於 當前事務版本號,就是說刪除操作是在當前事務啟動之後做的。 

建立版本號 小於或者等於 當前事務版本號 ,就是說記錄建立是在事務中(等於的情況)或者事務啟動之前。

這樣就保證了各個事務互不影響。從這裡也可以體會到一種提高系統效能的思路,就是:通過版本號來減少鎖的爭用。另外,只有read-committed和 repeatable-read 兩種事務隔離級別才能使用mvcc read-uncommited由於是讀到未提交的,所以不存在版本的問題。而serializable 則會對所有讀取的行加鎖。 

快照讀:讀取的是快照版本,也就是歷史版本

當前讀:讀取的是最新版本

普通的select就是快照讀,而update、delete、insert、select …  lock in share mode、select … for update是當前讀。

在乙個事務中,標準的select語句是不會加鎖,但是有兩種情況例外。select … lock in share mode 和 select … for update。

select... lockinshare mode

給記錄假設共享鎖,這樣一來的話,其它事務只能讀不能修改,直到當前事務提交

select...forupdate

給索引記錄加鎖,這種情況下跟update的加鎖情況是一樣的

consistent read (一致性讀),innodb用多版本來提供查詢資料庫在某個時間點的快照。如果隔離級別是repeatable read,那麼在同乙個事務中的所有一致性讀都讀的是事務中第乙個這樣的讀讀到的快照;如果是read committed,那麼乙個事務中的每乙個一致性讀都會讀到它自己重新整理的快照版本。consistent read(一致性讀)是read committed和repeatable read隔離級別下普通select語句預設的模式。一致性讀不會給它所訪問的表加任何形式的鎖,因此其它事務可以同時併發的修改它們。

悲觀鎖,正如它的名字那樣,資料庫總是認為別人會去修改它所要操作的資料,因此在資料庫處理過程中將資料加鎖。其實現依靠資料庫底層。

樂觀鎖,如它的名字那樣,總是認為別人不會去修改,只有在提交更新的時候去檢查資料的狀態。通常是給資料增加乙個欄位來標識資料的版本。

mvcc實現一致性非鎖定讀,這就***在同乙個事務中多次讀取相同的資料返回的結果是一樣的,解決了不可重複讀的問題。

資料庫正規化 簡單理解

自 第一正規化規定屬性不可拆分 第二正規化是為了解決由於非完全依靠 部份依賴 產生的資料冗餘問題,即通過拆分表達到消除部份依賴的目的。第三正規化是為了解決由於存在非主屬性對於碼的傳遞函式依賴,因此增刪主屬性會導致非主屬性資訊難以插入或者丟失問題,通過拆表,把依賴傳遞部分拆分成乙個單獨的表。bcnf正...

資料庫三正規化的簡單理解

資料庫正規化 正規化的級別 設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 巴斯 科德正規化 bcnf ...

簡單的理解資料庫三正規化

正規化 英文名稱是 normal form,它是英國人 e.f.codd 關聯式資料庫的老祖宗 在上個世紀70年代提出關聯式資料庫模型後總結出來的,正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。目前有跡可尋的共有8種正規化,依次是 1nf,2nf,3nf,b...