mysql 的mvcc 作用
Mysql有四種隔離級別,分別是讀未提交、讀已提交、可重復讀和串行化。mvcc可以實現(xiàn)讀已提交和可重復讀。對于讀已提交,mvcc會在每次查詢時生成ReadView快照,而對于可重復讀會在第一次查詢時生成ReadView快照。
mvcc的實現(xiàn)
mvcc的實現(xiàn)依賴于undo log版本鏈,和ReadView快照。
undo log中會保存事務的基本信息、當前事務id以及前一個undolog地址,日志與日志之間通過這樣的鏈接形成了版本鏈。
ReadView快照中包含了正在執(zhí)行的事務id數(shù)組(m_ids)、正在執(zhí)行事務id的最小值(min_trx_id)、下一個要生成的id(max_trx_id)、創(chuàng)建ReadView的事務id(creator_trx_id)。
如何判斷版本鏈中的某條日志內(nèi)容是否對當前事務可見
if (trx_id<min_trx_id) {
該版本對當前事務可見
} else if (trx_id >= max_trx_id){
該版本對當前事務不可見
} else {
if (m_ids.contains(trx_id)) {
該版本對當前事務不可見
} else {
該版本對當前事務可見
}
}