diff --git a/src/storage/tx/ob_trans_service_v4.h b/src/storage/tx/ob_trans_service_v4.h index b834c7777b..ed10d87cb8 100644 --- a/src/storage/tx/ob_trans_service_v4.h +++ b/src/storage/tx/ob_trans_service_v4.h @@ -196,6 +196,7 @@ TO_STRING_KV(K(is_inited_), K(tenant_id_), KP(this)); private: int check_ls_status_(const share::ObLSID &ls_id, bool &leader); int init_tx_(ObTxDesc &tx, const uint32_t session_id); +int reinit_tx_(ObTxDesc &tx, const uint32_t session_id); int start_tx_(ObTxDesc &tx); int abort_tx_(ObTxDesc &tx, const int cause, bool cleanup = true); void abort_tx__(ObTxDesc &tx, const bool cleanup); diff --git a/src/storage/tx/ob_tx_api.cpp b/src/storage/tx/ob_tx_api.cpp index 232d689830..f2f53b9961 100644 --- a/src/storage/tx/ob_tx_api.cpp +++ b/src/storage/tx/ob_tx_api.cpp @@ -148,10 +148,9 @@ int ObTransService::release_tx(ObTxDesc &tx, const bool is_from_xa) MTL_SWITCH(tx.tenant_id_) { return MTL(ObTransService*)->release_tx(tx); } - // FIXME: open check later - // } else if (NULL != tx.get_xa_ctx() && !is_from_xa) { - // ret = OB_ERR_UNEXPECTED; - // TRANS_LOG(ERROR, "unexpected case", K(ret), K(is_from_xa), K(tx)); + } else if (NULL != tx.get_xa_ctx() && !is_from_xa) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "unexpected case", K(ret), K(is_from_xa), K(tx)); } else { ObTransTraceLog &tlog = tx.get_tlog(); REC_TRANS_TRACE_EXT(&tlog, release, OB_Y(ret), @@ -212,9 +211,7 @@ int ObTransService::reuse_tx(ObTxDesc &tx) #endif } // it is safe to operate tx without lock when not shared - uint32_t session_id = tx.sess_id_; - tx.reset(); - ret = init_tx_(tx, session_id); + ret = reinit_tx_(tx, tx.sess_id_); } TRANS_LOG(TRACE, "reuse tx", K(ret), K(orig_tx_id), K(tx)); ObTransTraceLog &tlog = tx.get_tlog(); @@ -228,6 +225,12 @@ int ObTransService::reuse_tx(ObTxDesc &tx) return ret; } +int ObTransService::reinit_tx_(ObTxDesc &tx, const uint32_t session_id) +{ + tx.reset(); + return init_tx_(tx, session_id); +} + int ObTransService::stop_tx(ObTxDesc &tx) { int ret = OB_SUCCESS; diff --git a/src/storage/tx/ob_tx_free_route.cpp b/src/storage/tx/ob_tx_free_route.cpp index 50c1d32733..662382b8e6 100644 --- a/src/storage/tx/ob_tx_free_route.cpp +++ b/src/storage/tx/ob_tx_free_route.cpp @@ -431,7 +431,11 @@ int ObTransService::txn_free_route__update_static_state(const uint32_t session_i } else if (tx->tx_id_ != header.tx_id_) { // replace audit_record.replace_tx_ = true; - tx_desc_mgr_.remove(*tx); + if (!tx->flags_.SHADOW_) { + tx_desc_mgr_.remove(*tx); + } + // reset tx to cleanup for new txn + reinit_tx_(*tx, session_id); need_add_tx = true; } else { // update