Read View
Read View就是事務進行快照讀操作的時候生產的讀視圖(Read View),在該事務執行的快照讀的那一刻,會生成數據庫系統當前的一個快照,記錄並維護系統當前活躍事務的ID(當每個事務開啟時,都會被分配一個ID, 這個ID是遞增的,所以最新的事務,ID值越大)
我們可以把Read View簡單的理解成有三個全局屬性
trx_list
一個數值列表,用來維護Read View生成時刻系統正活躍的事務ID
up_limit_id
記錄trx_list列表中事務ID最小的ID
low_limit_id
ReadView生成時刻系統尚未分配的下一個事務ID,也就是目前已出現過的事務ID的最大值+1
首先比較DB_TRX_ID < up_limit_id, 如果小於,則當前事務能看到DB_TRX_ID 所在的記錄,如果大於等於進入下一個判斷
接下來判斷 DB_TRX_ID 大於等於 low_limit_id , 如果大於等於則代表DB_TRX_ID 所在的記錄在Read View生成后才出現的,那對當前事務肯定不可見,如果小於則進入下一個判斷
判斷DB_TRX_ID 是否在活躍事務之中,trx_list.contains(DB_TRX_ID),如果在,則代表我Read View生成時刻,你這個事務還在活躍,還沒有Commit,你修改的數據,我當前事務也是看不見的;如果不在,則說明,你這個事務在Read View生成之前就已經Commit了,你修改的結果,我當前事務是能看見的
在RC隔離級別下,是每個快照讀都會生成並獲取最新的Read View;
在RR隔離級別下,則是同一個事務中的第一個快照讀才會創建Read View, 之后的快照讀獲取的都是同一個Read View