MySQL事務(wù)隔離級(jí)別和MVCC 參考:https://mp.weixin.qq.com/s/Jeg8656gGtkPteYWrG5_Nw
- 1.MVCC只對(duì)讀已提交和可重復(fù)的讀有效果璃弄,而未提交讀和串行則無(wú)意義。
- 2.每條記錄都會(huì)有trx_id(事務(wù)修改記錄的id)和roll_pointer是一個(gè)指針指向舊版本的undo日志鏈表(row_id不是必必要的,如果有主鍵存在就不需要了)
- 3.版本鏈的頭結(jié)點(diǎn)就是記錄的最新的值篷角。
- 4.ReadVie--包含當(dāng)前系統(tǒng)中還有哪些活躍的讀寫事務(wù)恳蹲,把它們的事務(wù)id放入到一個(gè)列表中俩滥,列表命名為m_ids。同時(shí)還有min_trx_id和max_trx_id
- 5.min_trx_id:該值代表生成readview時(shí)m_ids中的最小值错忱。
- 6.max_trx_id:該值代表生成readview時(shí)系統(tǒng)中應(yīng)該分配給下一個(gè)事務(wù)的id值挂据。
- 7.注意max_trx_id并不是m_ids中的最大值,事務(wù)id是遞增分配的掷倔。比方說(shuō)現(xiàn)在有id為1个绍,2勒葱,3這三個(gè)事務(wù),之后id為3的記錄提交了巴柿。那么一個(gè)新的讀事務(wù)在生成readview時(shí)祷舀,m_ids就包括1和2粱锐,min_trx_id的值就是1哆致,max_trx_id的值就是4删掀。
- 8.所以判斷可見性的步驟就是:
- 9.如果記錄的trx_id列小于min_trx_id,說(shuō)明肯定可見。
- 10.如果記錄的trx_id列大于max_trx_id瓦阐,說(shuō)明肯定不可見蜗侈。
- 11.如果記錄的trx_id列在min_trx_id和max_trx_id之間,就要看一下該trx_id在不在m_ids列表中睡蟋,如果在踏幻,說(shuō)明不可見戳杀,否則可見该面。
- 12.如果trx_id在m_ids列表中則說(shuō)明事務(wù)還未提交則該記錄無(wú)法被提交隔缀。
- 13.如果某個(gè)版本的數(shù)據(jù)對(duì)當(dāng)前事務(wù)不可見的話,那就順著版本鏈找到下一個(gè)版本的數(shù)據(jù)傍菇,繼續(xù)按照上邊的步驟判斷可見性,依此類推丢习,直到版本鏈中的最后一個(gè)版本牵触,如果最后一個(gè)版本也不可見的話,那么就意味著該條記錄對(duì)該事務(wù)不可見咐低,查詢結(jié)果就不包含該記錄揽思。
- 14.
讀已提交則是每次查詢的時(shí)候都會(huì)生成一個(gè)新的readView。
- 15.
可重復(fù)讀則是第一次查詢生成readView见擦。