有了前面的補充,我們看下是否能解釋前面step7出現的問題
- 我們在T2的step8修改了id=1的title,但step 9,step10沒有看到,step9沒看到,大家不會有什么意外,因為step9對應的事務ID小于step8的事務ID,但step10的事務ID是大于step8的事務ID的,那么我們來分析一下是什么造成的,我們這里不說undo log的格式,我們只需要知道根據undo log我們可以知道記錄的多個版本
- 一開始,id=1的記錄是這樣的
- T1的step4
- m_up_limit_id=1,m_low_limit_id=1,m_createor_trx_id=1,trx_ids={},DATA_TRX_ID=0
- DATA_TRX_ID<m_up_limit_id, 在[m_up_limit_id,m_low_limit_id]的左側,記錄可見
- T2的step 5
- m_up_limit_id=1,m_low_limit_id=2,m_createor_trx_id=2,trx_ids={1},DATA_TRX_ID=0
- DATA_TRX_ID<m_up_limit_id, 在[m_up_limit_id,m_low_limit_id]的左側,記錄可見
- T3的step 6
- m_up_limit_id=1,m_low_limit_id=3,m_createor_trx_id=3,trx_ids={1,2},DATA_TRX_ID=0
- DATA_TRX_ID<m_up_limit_id, 在[m_up_limit_id,m_low_limit_id]的左側,記錄可見
- step7修改了數據,這時候id=1的記錄是這樣的
- T2的step8
*m_up_limit_id=1,m_low_limit_id=2,m_createor_trx_id=2,trx_ids={1},DATA_TRX_ID=2- DATA_TRX_ID在[m_up_limit_id,m_low_limit_id]的中間位置,m_createor_trx_id=DATE_TRX_ID,因此可見。所以看到了title=‘商品1 push’的這一行
- T1的step9
- m_up_limit_id=1,m_low_limit_id=1,m_createor_trx_id=1,trx_ids={},DATA_TRX_ID=2
- DATA_TRX_ID在[m_up_limit_id,m_low_limit_id]的右側,記錄不可見
- 那么接著通過DATE_ROLL_PTR,去undo找到了trx_id=0的這一行
- DATA_TRX_ID=0,DATA_TRX_ID<m_up_limit_id, 在[m_up_limit_id,m_low_limit_id]的左側,記錄可見
- step10
- m_up_limit_id=1,m_low_limit_id=3,m_createor_trx_id=3,trx_ids={1,2},DATA_TRX_ID=2
- DATA_TRX_ID在[m_up_limit_id,m_low_limit_id]的中間位置,并且在trx_ids中,記錄不可見
- 接著通過DATE_ROLL_PTR,去undo找到了trx_id=0的這一行
- DATA_TRX_ID=0, DATA_TRX_ID=0,DATA_TRX_ID<m_up_limit_id, 在[m_up_limit_id,m_low_limit_id]的左側,記錄可見
關于MVCC詳細講解就分享到這里了,希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。