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