通俗理解 mysql 的mvcc机制
mvcc (多版本并發控制),開啟多個事務,并基于快照讀Read View實現;
Read View幾個屬性
?? ?trx_ids: 當前系統活躍事務版本號集合;
?? ?low_limit_id: 創建當前read view 時, 系統最大事務版本號+1;
?? ?up_limit_id: 創建當前read view 時,? 活躍事務最小版本號;
?? ?creator_trx_id: 創建當前read view的事務版本號;
read_view ?可見性規則:
?1.數據事務ID小于read view中的最小活躍事務ID,即trx_id<up_limit_id,
? ?說明數據是在當前事務生成read view之前就已經存在了,則顯示
? ?
?2.數據事務ID大于或等于read view 中的當前系統的最大事務ID,即trx_id>low_limit_id,
? ? 說明該數據是在當前read view 創建之后才產生的,則不顯示
?
?3.trx_id = creator_trx_id,是本事務產生的數據,則顯示
?4.被訪問版本的trx_id,在readview的min_trx_id和max_trx_id之間,則需要判斷trx_id值是否在m_ids列表中
? ? 如果在:說明創建readview時,該版本的事務還未提交,通過回滾指針查找歷史版本并返回;
? ? 如果不在:說明創建readview時,該版本的事務已經提交,所以直接返回該版本的數據
結合具體列子,
準備一張表,字段為id,age,當我們插入一條數據的時候,mysql會增加幾個隱藏字段,不會展示給我們用戶,其中一個字段為事務id,即trx_id
準備三個事務,分別更新數據,trx_id是隱藏的,這里列出來方便說明
| id | age | ?trx_id | point | |
| 事務1 | 1 | 1 | 1 | 指針 |
| 事務2 | 1 | 2 | 2 | 指針 |
| 事務3 | 1 | 3 | 3 | 指針 |
? ? 注:這個不是表數據,事務提交或者回滾后,只有一條
首先,開啟事務1,插入一條數據id=1,age=1 這時隱藏列trx_id的值假如為1,以后的事務在此基礎上依次增長,提交事務,這時數據庫里就有一條數據了。
情景1
? ? ? 開啟事務2,執行查詢操作,
? ? ? 那么trx_id=2,mysql會記錄開啟是這個事務時的事務數據,包括目前存活的事務id列表trx_ids,值為2
? ? ? 最大事務id ,活躍的最大事務id+1,low_limit_id 為3;
? ? ? 最小事務id,up_limit_id 為2;
? ? ? 自己的事務版本,creator_trx_id為2
? ?開啟事務2執行查詢全表的操作,表中生成id為1的數據的事務id為1,即trx_id 1<2,顯示id=1的這條數據;
情景2
? ?開啟事務2,事務執行查詢之前,開啟了事務3,并更新為id=1,age=3,提交完成,此時事務2查詢,id=1的這條數據的trx_id為3,即trx_id 3>=3,不會顯示age=3的這條數據,通過回滾直接讀取歷史版本,顯示age為1的數據
情景3
? ?開啟事務2,事務3,事務3執行更新,未提交,
? ?事務2執行查詢操作,活動的事務trx_ids列表為(2,3),low_limit_id為4,up_limit_id為2
? ?age為3的記錄的trx_id處于 2 <= 3 <4,3在 trx_ids中,不顯示這個版本的數據;
情景4
? ?開啟事務2,事務3,事務3執行更新并提交,
? ?事務2執行查詢操作,活動的事務trx_ids列表為(2),low_limit_id為4,up_limit_id為2
? ?age為3的記錄的trx_id處于 2 <= 3 <4,3不在 trx_ids中,顯示這個版本的數據;
總結
以上是生活随笔為你收集整理的通俗理解 mysql 的mvcc机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EyouCMS精美简洁作文范文网站模板/
- 下一篇: 数据库密码忘了怎么办?CENTOS7下面