MySQL Row Purge: Removing Marked-for-Deletion Clustered Index Records
/**
-
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); }
原文地址: https://www.cveoy.top/t/topic/og6H 著作权归作者所有。请勿转载和采集!