mysql 設定mvcc mysql的MVCC機制

2021-10-18 21:05:51 字數 1327 閱讀 3116

一、undo log版本鏈

我們在執行update,insert,delete的時候會生成undo log日誌,以防止回滾使用。

一條sql執行,會生成一條undo log日誌:

其中trx_id就是執行這條sql的事務id,roll_pointer指向對同乙個值修改的undo log日誌,因為當前沒有,就指向乙個空物件。

又有乙個sql對這個資料進行修改,事務id為51,值改為b:

對同一條資料進行修改,通過roll_pointer連起來,就形成了undo log版本鏈。

二、readview機制

執行乙個事務的時候生成乙個readview,readview包括:

1.m_ids:還未提交的事務id

2.min_trx_id:m_ids中最小的事務id

3.max_trx_id:mysql生成的下乙個事務id

4.creator_trx_id:當前事務id,也就是建立這個read view的事務id

比如現在有事務a,事務b對資料進行修改,事務a生成的read view:

三、mysql的rr級別實現原理

那麼mysql的mvcc機制如何基於undo log版本鏈和readview來實現呢?

我們看看mysql預設的rr級別,解決了髒讀、不可重複讀、幻讀等問題:

髒讀:事務b開啟,undo log生成一條日誌。此時事務a來查詢,值為b的這條undo log,trx_id為60,比事務a中readview的creator_trx_id:50要大,說明在事務a開啟前執行的,查一下m_ids果然在這個集合裡面,說明這個事務和事務a同時進行的,繼續向下走。下一條日誌的trx_id為50,就是自己事務的id可以查詢,返回值a。這就解決了髒讀的問題。

不可重複讀:在事務b開啟前,事務a查詢到的值為a。提交後,事務a查詢到的值還是a,解決了不可重複讀的問題。

幻讀:比如執行一條sql:select count(*) where id>10;

事務a剛開始查詢時,滿足條件的只有3條。事務b此時插入一條資料,id為6。事務a來查詢,id>10的資料,發現復合查詢條件的有2條,一條為原始3條,一條為事務b提交後的4條。事務a比較trx_id比事務b的小,而且在m_ids中,所以返回的是原始資料那條還是3。這就解決了幻讀的問題。

mysql 許可權設定 mysql 許可權設定

關於mysql的使用者管理,筆記 1 建立新使用者 通過root使用者登入之後建立 grant all privileges on to testuser localhost identified by 123456 建立新使用者,使用者名為testuser,密碼為123456 grant all ...

mysql 快取設定 mysql快取設定

伺服器端的設定 mysql優化首先要知道mysql快取是如何工作以及如何設定,下面是我從別人部落格上覆制過來了,初學者。mysql每個表都可以表示為磁碟上的乙個檔案,必須先開啟,後讀取。為了加快從檔案中讀取資料的過程,mysqld 對這些開啟檔案進行了快取,其最大數目由 etc mysqld.con...

mysql 設定網域名稱 mysql 設定網域名稱

mysql 設定網域名稱 雲伺服器 elastic compute service,簡稱ecs 是阿里雲提供的效能卓越 穩定可靠 彈性擴充套件的iaas infrastructure as a service 級別雲計算服務。雲伺服器ecs免去了您採購it硬體的前期準備,讓您像使用水 電 天然氣等公...