企夢網(wǎng)站建設(shè)成功的網(wǎng)絡(luò)營銷案例及分析
1.MVCC概念
MVCC,全稱多版本并發(fā)控制
MVCC究竟是什么?
通俗的來說MVCC就是為了在讀取數(shù)據(jù)時不加鎖來提高讀取效率的一種辦法,MVCC解決的是讀寫時線程安全問題,線程不用去搶占讀寫鎖。MVCC中的讀就是快照讀,也就是普通的select語句。
2.MVCC原理
mvcc的具體實現(xiàn)通過數(shù)據(jù)庫中的三個隱式字段、undolog、readview
其中三個隱式字段分別是:
- DB_TRX_ID:最近修改事務(wù)ID
- DB_ROLL_PTR:回滾指針,指向這條記錄上一個版本,用于配合undolog,指向上一個版本
- DB_ROW_ID:隱藏主鍵,如果表結(jié)果沒有指定主鍵,將會生成該隱藏字段
undolog(回滾日志):
在insert、update、delete的時候產(chǎn)生便于數(shù)據(jù)回滾的日志
readview(讀視圖):
是快照讀SQL執(zhí)行時MVCC提取數(shù)據(jù)的依據(jù)(通俗的來說就是select的時候我們需要知道可以讀取哪個版本下的數(shù)據(jù)),記錄并維護(hù)當(dāng)前活躍的事務(wù),read view中包含四個核心字段:
- m_ids:當(dāng)前活躍的事務(wù)ID集合
- min_trx_id:最小活躍事務(wù)ID
- max_trx_id:預(yù)分配事務(wù)ID,當(dāng)前最大事務(wù)ID+1(因為事務(wù)ID是自增的)
- creator_trx_id:readview創(chuàng)建者的事務(wù)ID
readview中規(guī)定了版本鏈的訪問規(guī)則,trx_id表示當(dāng)前事務(wù)id:
- 1.trx_id==creator_trx_id:可以訪問該版本,說明數(shù)據(jù)是當(dāng)前這個事務(wù)更改的
- 2.trx_id<min_trx_id:可以訪問,說明數(shù)據(jù)已經(jīng)提交了
- 3.trx_id>max_trx_id:不可以訪問,說明事務(wù)時在readview生成之后才開啟的
- 4.min_trx_id<=trx_id<=max_trx_id:如果trx_id不在m_idx中,是可以訪問該版本的,說明數(shù)據(jù)已經(jīng)提交
不同的隔離級別生成readview的時機(jī)不同:
- read committed:在事務(wù)每執(zhí)行一次快照時生成readview
- repeatable read:僅在同一事務(wù)第一次快照讀時生成readview,后續(xù)復(fù)用該readview,所以每次讀取的結(jié)果都一樣