MySQL 行清理:删除标记为删除的聚簇索引记录
/*********************************************************/
-
如果可能,删除被标记为删除的聚簇索引记录。
-
@return 如果成功,或者未找到,或者在删除标记之后修改,则为TRUE / static ibool row_purge_remove_clust_if_poss_low( /===============================/ purge_node_t node, /!< in: 行清理节点 / ulint mode) /!< in: BTR_MODIFY_LEAF或BTR_MODIFY_TREE / { dict_index_t index; btr_pcur_t pcur; btr_cur_t* btr_cur; ibool success; ulint err; mtr_t mtr; rec_t* rec; mem_heap_t* heap = NULL; ulint offsets_[REC_OFFS_NORMAL_SIZE]; rec_offs_init(offsets_);
index = dict_table_get_first_index(node->table);
pcur = &(node->pcur); btr_cur = btr_pcur_get_btr_cur(pcur);
log_free_check(); mtr_start(&mtr);
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);
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/og6s 著作权归作者所有。请勿转载和采集!