/*********************************************************/

  • 如果可能,删除被标记为删除的聚簇索引记录。

  • @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); }

MySQL 行清理:删除标记为删除的聚簇索引记录

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

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