diff --git a/src/storage/tx/ob_xa_ctx.cpp b/src/storage/tx/ob_xa_ctx.cpp index a6e2f86c39..2785e5eb00 100644 --- a/src/storage/tx/ob_xa_ctx.cpp +++ b/src/storage/tx/ob_xa_ctx.cpp @@ -1540,6 +1540,7 @@ int ObXACtx::xa_start_remote_first_(const ObXATransID &xid, TRANS_LOG(WARN, "update xa stmt info failed", K(ret), K(xid), K(*this)); } else { // xa_ref_count_ is added only when success is returned + xa_trans_state_ = ObXATransState::ACTIVE; ++xa_ref_count_; tx_desc_->set_xid(xid); tx_desc_->set_xa_ctx(this); diff --git a/src/storage/tx/ob_xa_dblink_service.cpp b/src/storage/tx/ob_xa_dblink_service.cpp index fb9452ed2d..90d3ef3520 100644 --- a/src/storage/tx/ob_xa_dblink_service.cpp +++ b/src/storage/tx/ob_xa_dblink_service.cpp @@ -186,9 +186,9 @@ int ObXAService::xa_start_for_tm_promotion_(const int64_t flags, if (OB_SUCC(ret)) { //commit record if (OB_FAIL(trans.end(true))) { + // NOTE that if fail, do not release tx desc TRANS_LOG(WARN, "commit inner table trans failed", K(ret), K(xid)); - const bool need_decrease_ref = true; - xa_ctx->try_exit(need_decrease_ref); + xa_ctx_mgr_.erase_xa_ctx(tx_id); xa_ctx_mgr_.revert_xa_ctx(xa_ctx); } } else { @@ -197,7 +197,7 @@ int ObXAService::xa_start_for_tm_promotion_(const int64_t flags, TRANS_LOG(WARN, "rollback inner table trans failed", K(tmp_ret), K(xid)); } if (OB_NOT_NULL(xa_ctx)) { - xa_ctx_mgr_.erase_xa_ctx(trans_id); + xa_ctx_mgr_.erase_xa_ctx(tx_id); xa_ctx_mgr_.revert_xa_ctx(xa_ctx); } } @@ -318,6 +318,10 @@ int ObXAService::xa_start_for_tm_(const int64_t flags, } if (OB_FAIL(ret)) { TRANS_LOG(WARN, "start trans failed", K(ret), K(tx_id), K(xid)); + if (OB_SUCCESS != (tmp_ret = MTL(ObTransService*)->abort_tx(*tx_desc, + ObTxAbortCause::IMPLICIT_ROLLBACK))) { + TRANS_LOG(WARN, "fail to abort transaction", K(tmp_ret), K(tx_id), K(xid)); + } MTL(ObTransService *)->release_tx(*tx_desc); tx_desc = NULL; } else if (OB_FAIL(insert_xa_record(trans, tenant_id, xid, tx_id, sche_addr, flags))) { @@ -331,6 +335,10 @@ int ObXAService::xa_start_for_tm_(const int64_t flags, TRANS_LOG(WARN, "rollback lock record failed", K(tmp_ret), K(xid)); } // txs_->remove_tx(*tx_desc); + if (OB_SUCCESS != (tmp_ret = MTL(ObTransService*)->abort_tx(*tx_desc, + ObTxAbortCause::IMPLICIT_ROLLBACK))) { + TRANS_LOG(WARN, "fail to abort transaction", K(tmp_ret), K(tx_id), K(xid)); + } MTL(ObTransService *)->release_tx(*tx_desc); tx_desc = NULL; } else { @@ -362,6 +370,10 @@ int ObXAService::xa_start_for_tm_(const int64_t flags, if (OB_FAIL(trans.end(true))) { TRANS_LOG(WARN, "commit inner table trans failed", K(ret), K(xid)); const bool need_decrease_ref = true; + if (OB_SUCCESS != (tmp_ret = MTL(ObTransService*)->abort_tx(*tx_desc, + ObTxAbortCause::IMPLICIT_ROLLBACK))) { + TRANS_LOG(WARN, "fail to abort transaction", K(tmp_ret), K(tx_id), K(xid)); + } xa_ctx->try_exit(need_decrease_ref); xa_ctx_mgr_.revert_xa_ctx(xa_ctx); tx_desc = NULL; @@ -372,10 +384,14 @@ int ObXAService::xa_start_for_tm_(const int64_t flags, TRANS_LOG(WARN, "rollback inner table trans failed", K(tmp_ret), K(xid)); } if (OB_NOT_NULL(xa_ctx)) { - xa_ctx_mgr_.erase_xa_ctx(trans_id); + xa_ctx_mgr_.erase_xa_ctx(tx_id); xa_ctx_mgr_.revert_xa_ctx(xa_ctx); } // since tx_desc is not set into xa ctx, release tx desc explicitly + if (OB_SUCCESS != (tmp_ret = MTL(ObTransService*)->abort_tx(*tx_desc, + ObTxAbortCause::IMPLICIT_ROLLBACK))) { + TRANS_LOG(WARN, "fail to abort transaction", K(tmp_ret), K(tx_id), K(xid)); + } MTL(ObTransService *)->release_tx(*tx_desc); tx_desc = NULL; } diff --git a/src/storage/tx/ob_xa_service.cpp b/src/storage/tx/ob_xa_service.cpp index c5539f10b8..d747b0ba22 100644 --- a/src/storage/tx/ob_xa_service.cpp +++ b/src/storage/tx/ob_xa_service.cpp @@ -1111,6 +1111,10 @@ int ObXAService::xa_start_(const ObXATransID &xid, TRANS_LOG(WARN, "rollback lock record failed", K(tmp_ret), K(xid)); } if (is_first_xa_start) { + if (OB_SUCCESS != (tmp_ret = MTL(ObTransService*)->abort_tx(*tx_desc, + ObTxAbortCause::IMPLICIT_ROLLBACK))) { + TRANS_LOG(WARN, "fail to abort transaction", K(tmp_ret), K(trans_id), K(xid)); + } MTL(ObTransService *)->release_tx(*tx_desc); tx_desc = NULL; } @@ -1143,6 +1147,10 @@ int ObXAService::xa_start_(const ObXATransID &xid, if (OB_FAIL(trans.end(true))) { TRANS_LOG(WARN, "commit inner table trans failed", K(ret), K(xid)); const bool need_decrease_ref = true; + if (OB_SUCCESS != (tmp_ret = MTL(ObTransService*)->abort_tx(*tx_desc, + ObTxAbortCause::IMPLICIT_ROLLBACK))) { + TRANS_LOG(WARN, "fail to abort transaction", K(tmp_ret), K(trans_id), K(xid)); + } xa_ctx->try_exit(need_decrease_ref); xa_ctx_mgr_.revert_xa_ctx(xa_ctx); tx_desc = NULL; @@ -1157,6 +1165,10 @@ int ObXAService::xa_start_(const ObXATransID &xid, xa_ctx_mgr_.revert_xa_ctx(xa_ctx); } // since tx_desc is not set into xa ctx, release tx desc explicitly + if (OB_SUCCESS != (tmp_ret = MTL(ObTransService*)->abort_tx(*tx_desc, + ObTxAbortCause::IMPLICIT_ROLLBACK))) { + TRANS_LOG(WARN, "fail to abort transaction", K(tmp_ret), K(trans_id), K(xid)); + } MTL(ObTransService *)->release_tx(*tx_desc); tx_desc = NULL; }