MySQL可重複度隔離級別的實現原理

2021-10-11 14:39:03 字數 1366 閱讀 2010

mysql預設的隔離級別是可重複讀,即:事務a在讀到一條資料之後,此時事務b對該資料進行了修改並提交,那麼事務a再讀該資料,讀到的還是原來的內容。 那麼mysql可重複讀是如何實現的呢?

使用的的一種叫mvcc的控制方式 ,即mutil-version concurrency control,多版本併發控制,類似於樂觀鎖的一種實現方式

實現方式:

innodb在每行記錄後面儲存兩個隱藏的列來,分別儲存了這個行的建立時間和行的刪除時間。這裡儲存的並不是實際的時間值,而是系統版本號,當資料被修改時,版本號加1

在讀取事務開始時,系統會給當前讀事務乙個版本號,事務會讀取版本號<=當前版本號的資料

此時如果其他寫事務修改了這條資料,那麼這條資料的版本號就會加1,從而比當前讀事務的版本號高,讀事務自然而然的就讀不到更新後的資料了

假設初始版本號為1:
insert

into

user (id,name) values (1,'tom');

id

name

create_version

delete_version

1tom

1

select * from

user

where

id = 1;

此時讀到的版本號為1

update

user

setname = 'jerry'

where

id = 1;

在更新操作的時候,該事務的版本號在原來的基礎上加1,所以版本號為2。

先將要更新的這條資料標記為已刪除,並且刪除的版本號是當前事務的版本號,然後插入一行新的記錄

idname

create_version

delete_version

1tom12

1jerry

2此時事務a再重新讀資料:

select * from

user

where

id = 1;

由於事務a一直沒提交,所以此時讀到的版本號還是為1,所以讀到的還是tom這條資料,也就是可重複讀

delete

from

user

where

id = 1;

在刪除操作的時候,該事務的版本號在原來的基礎上加1,所以版本號為3

刪除時,將當前版本號作為刪除版本號

idname

create_version

delete_version

1jerry23

分類:

資料庫

MySQL可重複讀隔離級別的實現原理

參考 mysql預設的隔離級別是可重複讀,即 事務a在讀到一條資料之後,此時事務b對該資料進行了修改並提交,那麼事務a再讀該資料,讀到的還是原來的內容。那麼mysql可重複讀是如何實現的呢?使用的的一種叫mvcc的控制方式 即mutil version concurrency control,多版本...

MySQL可重複讀隔離級別的實現原理

1 原理 mysql預設的隔離級別是可重複讀,即 事務a在讀到一條資料之後,此時事務b對該資料進行了修改並提交,那麼事務a再讀該資料,讀到的還是原來的內容。那麼mysql可重複讀是如何實現的呢?使用的的一種叫mvcc的控制方式 即mutil version concurrency control,多...

mysql隔離級別的說明

原子性 一致性 隔離性 永續性 多事物同時執行的時候可能會出現髒讀 不可重複讀 幻讀 事物的隔離級別 讀未提交 read uncommitted 會出現髒讀 一般用的非常少 讀提交 read committed 可重複讀 repeatable read 序列化 serializable 用的很少 嚴...