|
|
|
@ -1003,7 +1003,7 @@ trx_roll_pop_top_rec_of_trx(trx_t* trx, roll_ptr_t* roll_ptr, mem_heap_t* heap) |
|
|
|
trx_roll_try_truncate(trx); |
|
|
|
} |
|
|
|
|
|
|
|
trx_undo_t* undo; |
|
|
|
trx_undo_t* undo = NULL; |
|
|
|
trx_undo_t* insert = trx->rsegs.m_redo.insert_undo; |
|
|
|
trx_undo_t* update = trx->rsegs.m_redo.update_undo; |
|
|
|
trx_undo_t* temp = trx->rsegs.m_noredo.undo; |
|
|
|
@ -1017,17 +1017,26 @@ trx_roll_pop_top_rec_of_trx(trx_t* trx, roll_ptr_t* roll_ptr, mem_heap_t* heap) |
|
|
|
|| update->top_undo_no != temp->top_undo_no); |
|
|
|
|
|
|
|
if (insert && !insert->empty && limit <= insert->top_undo_no) { |
|
|
|
if (update && !update->empty |
|
|
|
&& update->top_undo_no > insert->top_undo_no) { |
|
|
|
undo = insert; |
|
|
|
} |
|
|
|
|
|
|
|
if (update && !update->empty && update->top_undo_no >= limit) { |
|
|
|
if (!undo) { |
|
|
|
undo = update; |
|
|
|
} else if (undo->top_undo_no < update->top_undo_no) { |
|
|
|
undo = update; |
|
|
|
} else { |
|
|
|
undo = insert; |
|
|
|
} |
|
|
|
} else if (update && !update->empty && limit <= update->top_undo_no) { |
|
|
|
undo = update; |
|
|
|
} else if (temp && !temp->empty && limit <= temp->top_undo_no) { |
|
|
|
undo = temp; |
|
|
|
} else { |
|
|
|
} |
|
|
|
|
|
|
|
if (temp && !temp->empty && temp->top_undo_no >= limit) { |
|
|
|
if (!undo) { |
|
|
|
undo = temp; |
|
|
|
} else if (undo->top_undo_no < temp->top_undo_no) { |
|
|
|
undo = temp; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (undo == NULL) { |
|
|
|
trx_roll_try_truncate(trx); |
|
|
|
/* Mark any ROLLBACK TO SAVEPOINT completed, so that
|
|
|
|
if the transaction object is committed and reused |
|
|
|
|