openGauss源码#RowLookup:行数据的查找相关
2020-12-26 本文已影响0人
upup果
在更新和删除一行数据前,首先需要通过RowLookup函数找到需要操作的Row.今天介绍一下相关函数:
- txn_access
这个是最底层的调用,首先,RowLookup会在m_rowSet中寻找指定sentinel的access,如果找到,设置其为LastAccess,如果没找到就返回nullptr.AccessLookup,使用RowLookup找到的access,如果access为空就返回NOT_FOUND.如果不空,根据access的访问类型有不同的返回结果:
①访问类型为RD,RD_FOR_UPDATE,WR:返回RC_LOCAL_ROW_FOUND,row为access的m_localRow
②如果访问类型是DEL:返回RC_LOCAL_ROW_DELETED
③如果访问类型是INS:下一个是WR或者是RD_FOR_UPDATE时,new一个新row给access的m_localRow.返回RC_LOCAL_ROW_FOUND,如果是upgrade,返回access的m_auxRow,否则返回m_loaclInsertRow. - txn
这是事务中的上层调用,主要是调用txn_access.RowLookup:调用txn_access中的RowLookup,根据返回值做不同的处理.RC_LOCAL_ROW_DELETED则返回空,RC_LOCAL_ROW_FOUND则返回找到的row,RC_LOCAL_ROW_NOT_FOUND:如果是读已提交隔离级别,并且操作类型是RD,则通过GetReadCommitedRow方法获取提交的row,否则就新建一个access,并添加到MapRowtoLocalTable,返回这个新建access的row.