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

2021-10-09 06:36:28 字數 2106 閱讀 2252

1、原理

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

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

實現方式:

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

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

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

2、增刪改查

假設初始版本號為1:

insert

insert into user (id,name) values (1,

'tom'

);

select * from user where id =

1;

此時讀到的版本號為1

update(事務b)

update user set name =

'jerry' where id =

1;

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

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

idname

create_version

delete_version

1tom12

1jerry

2 select (事務a)

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

select * from user where id =

1;

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

delete

delete from user where id =1;

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

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

id

name

create_version

delete_version

1jerry23

mvcc邏輯流程-查詢

此時,資料查詢規則如下:

查詢資料行版本號早於當前事務版本號的資料行記錄

也就是說,資料行的版本號要小於或等於當前是事務的系統版本號,這樣也就確保了讀取到的資料是當前事務開始前已經存在的資料,或者是自身事務改變過的資料

查詢刪除版本號要麼為null,要麼大於當前事務版本號的記錄

這樣確保查詢出來的資料行記錄在事務開啟之前沒有被刪除

很明顯可重複讀的隔離級別沒有辦法徹底的解決幻讀的問題,如果我們的專案中需要解決幻讀的話也有兩個辦法:

使用序列化讀的隔離級別

mvcc+next-key locks:next-key locks由record locks(索引加鎖/行鎖) 和 gap locks(間隙鎖,每次鎖住的不光是需要使用的資料,還會鎖住這些資料附近的資料)的結合,next-key lock 會鎖定範圍和自身行,比如select…where id<6,鎖定的是小於6的行和等於6的行

next-key lock即在事務中select時使用如下方法加鎖,這樣在另乙個事務對範圍內的資料進行修改時就會阻塞:

select * from table where id<

6 lock in share mode;

--共享鎖

select * from table where id<

6for update;

--排他鎖

實際上很多的專案中是不會使用到上面的兩種方法的,序列化讀的效能太差,而且其實幻讀很多時候是我們完全可以接受的。

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

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

事務隔離級別 可重複讀

mysql pom 5 select global.tx isolation global.tx isolation repeatable read 如果事務隔離級別顯示repeatable read,即是可重複讀。在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。我們的資料庫鎖...

MySQL事務隔離級別可重複讀測試

開啟rds,查詢當前的事務隔離級別select tx isolation查詢得到時候可重複讀,於是做了如下測試。可重複隔離級別的特點是,每個事務可以在乙個事務中可以反覆讀取資料,每次讀取到的資料都是相同的。在 高效能mysql 一書中,講到這種隔離級別很好的解決了髒讀問題,也就是讀取的資料都是事務開...