Removes a secondary index entry if foundreturn DB_SUCCESS DB_FAIL or DB_OUT_OF_FILE_SPACE staticulintrow_undo_ins_remove_sec_low======================== ulint mode ! in BTR_MODIFY_LEAF or BTR_MODIFY_
/***********************************************************// 如果找到了,则删除二级索引条目。 @return DB_SUCCESS、DB_FAIL 或 DB_OUT_OF_FILE_SPACE / static ulint row_undo_ins_remove_sec_low(ulint mode, dict_index_t index, dtuple_t entry) { btr_pcur_t pcur; btr_cur_t btr_cur; ulint err; mtr_t mtr; enum row_search_result search_result;
mtr_start(&mtr); // 开始一个新的Mini-Transaction
btr_cur = btr_pcur_get_btr_cur(&pcur); // 获取指向B-tree的游标
ut_ad(mode == BTR_MODIFY_TREE || mode == BTR_MODIFY_LEAF); // 断言mode参数只能是BTR_MODIFY_TREE或BTR_MODIFY_LEAF
search_result = row_search_index_entry(index, entry, mode, &pcur, &mtr); // 在B-tree中搜索entry条目
switch (search_result) {
case ROW_NOT_FOUND: // 未找到
err = DB_SUCCESS;
goto func_exit;
case ROW_FOUND: // 找到
break;
case ROW_BUFFERED: // 缓存
case ROW_NOT_DELETED_REF: // 未删除引用
/* 这些是无效的结果,因为传递给row_search_index_entry()的mode标志没有包括BTR_INSERT、BTR_DELETE或BTR_DELETE_MARK标志。 */
ut_error;
}
if (mode == BTR_MODIFY_LEAF) { // 以乐观的方式删除记录
err = btr_cur_optimistic_delete(btr_cur, &mtr) ? DB_SUCCESS : DB_FAIL;
} else { // 以悲观的方式删除记录
ut_ad(mode == BTR_MODIFY_TREE);
/* 在这里没有必要区分RB_RECOVERY,因为我们正在删除一个二级索引记录:RB_NORMAL和RB_RECOVERY之间的区别仅在于删除包含外部存储列的记录时才有意义。 */
ut_ad(!dict_index_is_clust(index));
btr_cur_pessimistic_delete(&err, FALSE, btr_cur, RB_NORMAL, &mtr);
}
func_exit: btr_pcur_close(&pcur); // 关闭B-tree游标 mtr_commit(&mtr); // 提交Mini-Transaction
return(err); // 返回操作结果
原文地址: http://www.cveoy.top/t/topic/fsXC 著作权归作者所有。请勿转载和采集!