diff --git a/src/storage/access/ob_table_scan_iterator.cpp b/src/storage/access/ob_table_scan_iterator.cpp index ae7484b3e2..d7660f6aed 100644 --- a/src/storage/access/ob_table_scan_iterator.cpp +++ b/src/storage/access/ob_table_scan_iterator.cpp @@ -563,13 +563,18 @@ int ObTableScanIterator::check_txn_status_if_read_uncommitted_() { int ret = OB_SUCCESS; auto &acc_ctx = ctx_guard_.get_store_ctx().mvcc_acc_ctx_; - auto &snapshot = acc_ctx.snapshot_; - if (snapshot.tx_id_.is_valid() && acc_ctx.mem_ctx_) { + if (acc_ctx.snapshot_.tx_id_.is_valid() && acc_ctx.mem_ctx_) { if (acc_ctx.mem_ctx_->is_tx_rollbacked()) { - // The txn has been killed during normal processing. So we return - // OB_TRANS_KILLED to prompt this abnormal state. - ret = OB_TRANS_KILLED; - STORAGE_LOG(WARN, "txn termianted when table scan", K(ret), K(acc_ctx)); + if (acc_ctx.mem_ctx_->is_for_replay()) { + // goes here means the txn was killed due to LS's GC etc, + // return NOT_MASTER + ret = OB_NOT_MASTER; + } else { + // The txn has been killed during normal processing. So we return + // OB_TRANS_KILLED to prompt this abnormal state. + ret = OB_TRANS_KILLED; + STORAGE_LOG(WARN, "txn has terminated", K(ret), "tx_id", acc_ctx.tx_id_); + } } } return ret; diff --git a/src/storage/ob_value_row_iterator.cpp b/src/storage/ob_value_row_iterator.cpp index 47e1235073..24840d3e34 100644 --- a/src/storage/ob_value_row_iterator.cpp +++ b/src/storage/ob_value_row_iterator.cpp @@ -293,13 +293,20 @@ int ObSingleRowGetter::get_next_row(ObNewRow *&row) } if (OB_SUCC(ret) || OB_ITER_END == ret) { // check txn status not aborted, which cause readout incorrect result - if (store_ctx_->mvcc_acc_ctx_.snapshot_.tx_id_.is_valid() && - store_ctx_->mvcc_acc_ctx_.mem_ctx_ && - store_ctx_->mvcc_acc_ctx_.mem_ctx_->is_tx_rollbacked()) { - // The txn has been killed during normal processing. So we return - // OB_TRANS_KILLED to prompt this abnormal state. - ret = OB_TRANS_KILLED; - STORAGE_LOG(WARN, "txn has terminated", K(ret)); + auto &acc_ctx = store_ctx_->mvcc_acc_ctx_; + if (acc_ctx.snapshot_.tx_id_.is_valid() && + acc_ctx.mem_ctx_ && + acc_ctx.mem_ctx_->is_tx_rollbacked()) { + if (acc_ctx.mem_ctx_->is_for_replay()) { + // goes here means the txn was killed due to LS's GC etc, + // return NOT_MASTER + ret = OB_NOT_MASTER; + } else { + // The txn has been killed during normal processing. So we return + // OB_TRANS_KILLED to prompt this abnormal state. + ret = OB_TRANS_KILLED; + STORAGE_LOG(WARN, "txn has terminated", K(ret), "tx_id", acc_ctx.tx_id_); + } } } return ret;