美文网首页
openGauss源码#事务中的行insert

openGauss源码#事务中的行insert

作者: upup果 | 来源:发表于2020-12-11 09:27 被阅读0次

之前介绍的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方法),查找的结果有三种,找到的行是已经标记为删除的,直接将新插入的映射到缓存中,如果是找到了但是未删除,或者是已经提交,则废弃报错.
  • 当插入失败废弃时,清理行数据和索引.

相关文章

网友评论

      本文标题:openGauss源码#事务中的行insert

      本文链接:https://www.haomeiwen.com/subject/tmrlgktx.html