一娃惯、什么是mvcc
? ? mvcc(multiversion concurrency control),多版本并發(fā)控制肥败,主要是在事務的讀已提交和可重復讀情況下發(fā)揮作用趾浅。
????它主要通過在更新的行加三個字段:
? ? 1愕提、最近一次修改事務id(DBTRXID)
? ? 2、回滾指針皿哨,指向undolog的記錄(DBROLLPTR )
? ? 3浅侨、DBROWID,唯一標識
二证膨、mvcc原理
? ? 1如输、先從更新操作開始,如某一時刻央勒,事務10000對一條記錄進行修改不见,那么它將會把當前記錄保存在undolog中,然后再更新該條記錄的事務id崔步,和回滾指針脖祈,最后更新該列需要需改的數(shù)據(jù)。這里補充一個小知識點刷晋,每次都會寫入一條回滾日志盖高,那這個回滾日志何時回收呢?在mysql編程在不需要的時候才刪除眼虱。也就是說喻奥,系統(tǒng)會判斷,當沒有事務再需要用到這些回滾日志時捏悬,回滾日志會被刪除撞蚕。
? ??讀取的記錄的事務ID小于低水位撵溃,說明這個版本的數(shù)據(jù)在開啟本事務前已經(jīng)提交疚鲤,是可見的,直接返回這個數(shù)據(jù)?缘挑。
????讀取的記錄的事務ID大于高水位集歇,說明這個版本的數(shù)據(jù)在開啟本事務后提交的,不可見语淘,從記錄中取出 DBROLLPTR 指向的記錄并讀取其事務 ID诲宇,開始下一輪的判斷?
????這里個人簡單的總結一下虐秋,當時看mysql編程實戰(zhàn)的時候,總有些不懂垃沦,這個視圖到底是個什么東西客给,看了上述的文章,才明白肢簿。再讀未提交的情況下靶剑,不采用mvcc機制。這也就是讀提交操作當?shù)刈隽耸裁床僮魇沟每梢宰x已經(jīng)提交池充。就是通過上面所說的視圖桩引。這里,也可以發(fā)現(xiàn)讀已提交和可重復讀的區(qū)別收夸,讀提交的視圖是在每次查詢的時候生成的坑匠,因此一個事務,或許有多個“版本”的視圖卧惜,因此厘灼,當每次查詢的時候讀已提交可以保證這個事務是“最新”的。而可重復讀咽瓷,視圖的創(chuàng)建在第一個select设凹,可以保證后續(xù)的事務提交對本事務沒影響。
? ?但這里有一個問題需要注意茅姜,update围来、insert、delete都會有一個隱式的查詢操作匈睁,但它們都是當前讀(快照讀不加鎖监透,對于非唯一索引或普通字段,很容易引起沖突)航唆,讀取的都是最近的數(shù)據(jù)胀蛮,但問題是一旦其他事務刪除了記錄(添加),這可能會引起幻讀糯钙。