mysql InnoDB一致性非鎖定讀(MVCC)

2021-10-04 10:46:33 字數 2733 閱讀 1352

一致性非鎖定讀(consistent nonlocking read)

指innodb儲存引擎通過多版本控制的方法來讀取當前執行時間資料庫中行的資料。如果讀取的資料行正在執行delete或update操作,這時讀取不會因此去等待行上鎖 的釋放。相反innodb儲存引擎會去讀取乙個快照資料。

之所以成為非鎖定讀,因為這種方式不需要等待訪問行上的排他鎖的釋放。

快照資料(當前行資料之前的歷史版本),每行記錄可能有多個版本

快照資料,是事務已提交後的資料,可能是其它事務已提交的的資料。

比如說 表內資料num =1;

a事務 b事務

begin

get num =

1

begin

set num = num +

1 get num =

2 commit

get num <

----

----

----

----

----

----

----

----

----

----

---- 如果rr級別,則 num =

1

如果rc級別,則 num =

2

set num = num +

1<

----

----

----

----

----

----

----

---update執行成功,返回1

get num <

----

----

----

----

----

----

----

----

----

----

----

---如果rr級別,則 num =

3 如果rc級別,則 num =

3

比如說 表內資料num =1;

a事務 b事務

begin

get num =

1

begin

set num = num +

1 get num =

2 commit

get num <

----

----

----

----

----

----

----

----

----

----

---- 如果rr級別,則 num =

1

如果rc級別,則 num =

2

set num = num +

1 where num =

1<

----

----

----

----

----

----

----

---update執行失敗,返回0

get num <

----

----

----

----

----

----

----

----

----

----

----

---如果rr級別,則 num =

1 如果rc級別,則 num =

2

比如說 表內資料num =1;

a事務 b事務

begin

begin

update table set <

----

----

----

----

----

----

----

----

----

----

---獲取id=id1那一行的排他鎖

num = num +

1 where id = id1;

update table set <

----

----id1行排他鎖正在被事務a占用,

num = num +

1 where id = id1; 事務b阻塞等待

commit;

<

----

----

----

----

----

----

----

----

----

----

---- 釋放id=id1那一行的排他鎖

等到事務a釋放掉id1行的排他鎖,

事務b就可以嘗試獲取到id1行的排他鎖並執行update更新語句。

commit;

<

--- 釋放id=id1那一行的排他鎖

總結:

強一致性 弱一致性 最終一致性

這種方式在es等分布式系統中也有體現,可以設定主shard提交即返回成功,或者需要replica shard提交成功再返回。提到分布式架構就一定繞不開 一致性 問題,而 一致性 其實又包含了資料一致性和事務一致性兩種情況,本文主要討論資料一致性 事務一致性指acid 複製是導致出現資料一致性問題的唯...

一致性非鎖定讀和一致性鎖定讀

在預設配置下innodb的隔離級別是repeatable read,innodb的select操作使用的是一致性非鎖定讀 一致性的非鎖定行讀 consistent nonlocking read,簡稱cnr 是指innodb儲存引擎通過行多版本控制 multi versioning 的方式來讀取當前...

一致性非鎖定讀與一致性鎖定讀

一致性非鎖定讀 consistent nonlocking read 是指innodb儲存引擎通過 行多版本控制 multi versioning 的方式來讀取當前執行時間資料庫中行的資料。如果讀取的行正在執行delete或update操作,這時讀取操作不會因此去等待行上鎖的釋放,相反地,innod...