之前介绍的insert过程,是在server端存储层执行的,还没通过事务提交,对用户不可见.今天主要看了事务插入的过程.在执行BuildKey函数获取主键后,调用txn->GetNextInsertItem()->SetItem(row, ix, key),
将信息添加到一个InsItem对象中.然后以类似的方式添加到二级索引中.最后调用txn->InsertRow(row),下面主要介绍txn->InsertRow(row)如何事务执行插入行的过程,主要是OCC的乐观插入,即ExecuteOptimisticInsert:
- 获取m_insertSet中的初始InsItem
- 调用InsItem的索引的插入方法(具体的插入过程我会在后面单独写一个文章来介绍),将插入结果保存在pIndexInsertResult中,如果是主键的话,为行设置SetAbsentRow和SetPrimarySentinel
- 如果sentinel未提交,调用AddInsertToLocalAccess(pIndexInsertResult, row, rc),将其添加到本地缓存中。具体过程是,先获取一个新的Access指针,如果是upgrade,用org_sentinel作参数,如果不是,就用org_row作参数。
- 如果sentinel已经提交,则在本地缓存中查找这个row(AccessLookup方法),查找的结果有三种,找到的行是已经标记为删除的,直接将新插入的映射到缓存中,如果是找到了但是未删除,或者是已经提交,则废弃报错.
- 当插入失败废弃时,清理行数据和索引.
网友评论