有了前面的补充,我们看下是否能解释前面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详细讲解就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。