/***********************************************************// 如果找到了,则删除二级索引条目。 @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); // 返回操作结果
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_

原文地址: http://www.cveoy.top/t/topic/fsXC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录