/**

  • row_purge_remove_clust_if_poss_low函数尝试删除标记为删除的聚簇索引记录。

  • 如果成功删除、没有找到该记录或者在标记删除后被修改过,则返回TRUE。

  • @param node row purge节点

  • @param mode 操作模式:BTR_MODIFY_LEAF或BTR_MODIFY_TREE

  • @return 如果成功删除、没有找到该记录或者在标记删除后被修改过,则返回TRUE / static ibool row_purge_remove_clust_if_poss_low( purge_node_t node, ulint mode) { dict_index_t* index; // 索引 btr_pcur_t* pcur; // B-tree pcur btr_cur_t* btr_cur; // B-tree cur ibool success; // 删除是否成功 ulint err; mtr_t mtr; // mtr rec_t* rec; // 记录 mem_heap_t* heap = NULL; // 内存堆 ulint offsets_[REC_OFFS_NORMAL_SIZE]; // 偏移量数组,初始化为0 rec_offs_init(offsets_); // 初始化偏移量数组

    // 获取表的第一个索引 index = dict_table_get_first_index(node->table);

    // 获取B-tree pcur和cur pcur = &(node->pcur); btr_cur = btr_pcur_get_btr_cur(pcur);

    log_free_check(); // 检查日志是否空闲 mtr_start(&mtr); // 开始mtr事务

    // 移动pcur到合适的位置 success = row_purge_reposition_pcur(mode, node, &mtr);

    if (!success) { // 记录已经被移除 btr_pcur_commit_specify_mtr(pcur, &mtr); return(TRUE); }

    // 获取记录 rec = btr_pcur_get_rec(pcur);

    // 如果记录的roll_ptr与node的roll_ptr不同,则说明在标记删除后该记录已被修改过,不删除 if (node->roll_ptr != row_get_rec_roll_ptr( rec, index, rec_get_offsets(rec, index, offsets_, ULINT_UNDEFINED, &heap))) { if (UNIV_LIKELY_NULL(heap)) { mem_heap_free(heap); } // 有人修改了该记录: 不删除 btr_pcur_commit_specify_mtr(pcur, &mtr); return(TRUE); }

    if (UNIV_LIKELY_NULL(heap)) { mem_heap_free(heap); }

    // 根据操作模式执行删除操作 if (mode == BTR_MODIFY_LEAF) { success = btr_cur_optimistic_delete(btr_cur, &mtr); } else { ut_ad(mode == BTR_MODIFY_TREE); btr_cur_pessimistic_delete(&err, FALSE, btr_cur, RB_NONE, &mtr);

     if (err == DB_SUCCESS) {
         success = TRUE;
     } else if (err == DB_OUT_OF_FILE_SPACE) {
         success = FALSE;
     } else {
         ut_error;
     }
    

    }

    btr_pcur_commit_specify_mtr(pcur, &mtr); // 提交事务

    return(success); }

MySQL Row Purge: Removing Marked-for-Deletion Clustered Index Records

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

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