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

2021-10-09 03:49:25 字數 1179 閱讀 4433

參考:

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 set name = '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可重複讀隔離級別的實現原理

1 原理 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 一書中,講到這種隔離級別很好的解決了髒讀問題,也就是讀取的資料都是事務開...