[xa][4.x] acquire data lock before set tx desc in session for xa

This commit is contained in:
jw-guo
2023-07-07 07:42:12 +00:00
committed by ob-robot
parent b46af57d65
commit d8586ce753
3 changed files with 19 additions and 5 deletions

View File

@ -90,6 +90,7 @@ int ObTMService::tm_rm_start(ObExecContext &exec_ctx,
// step 2, promote or start trans in current session
if (OB_SUCCESS != ret) {
} else {
ObSQLSessionInfo::LockGuard data_lock_guard(my_session->get_thread_data_lock());
const int64_t timeout_seconds = my_session->get_xa_end_timeout_seconds();
//if (need_start || need_promote) {
// if (OB_FAIL(ObXAService::generate_xid(xid))) {
@ -160,6 +161,7 @@ int ObTMService::tm_commit(ObExecContext &exec_ctx,
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected param", K(ret), KP(xa_service), KP(my_session), KP(tx_desc));
} else {
ObSQLSessionInfo::LockGuard data_lock_guard(my_session->get_thread_data_lock());
tx_id = tx_desc->tid();
if (OB_FAIL(xa_service->commit_for_dblink_trans(tx_desc))) {
LOG_WARN("fail to commit for dblink trans", K(ret));
@ -193,6 +195,7 @@ int ObTMService::tm_rollback(ObExecContext &exec_ctx,
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected param", K(ret), KP(xa_service), KP(my_session), KP(tx_desc));
} else {
ObSQLSessionInfo::LockGuard data_lock_guard(my_session->get_thread_data_lock());
tx_id = tx_desc->tid();
if (OB_FAIL(xa_service->rollback_for_dblink_trans(tx_desc))) {
LOG_WARN("fail to rollback for dblink trans", K(ret));
@ -227,6 +230,7 @@ int ObTMService::recover_tx_for_callback(const ObTransID &tx_id,
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected session", K(ret), K(tx_id), K(tx_desc->tid()));
} else {
ObSQLSessionInfo::LockGuard data_lock_guard(my_session->get_thread_data_lock());
if (OB_FAIL(xa_service->recover_tx_for_dblink_callback(tx_id, tx_desc))) {
LOG_WARN("fail to recover tx for dblink callback", K(ret), K(tx_id));
} else if (NULL == tx_desc || tx_desc->get_xid().empty()) {
@ -254,6 +258,7 @@ int ObTMService::revert_tx_for_callback(ObExecContext &exec_ctx)
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected session", K(ret), K(tx_desc->tid()));
} else {
ObSQLSessionInfo::LockGuard data_lock_guard(my_session->get_thread_data_lock());
tx_id = tx_desc->tid();
if (OB_FAIL(xa_service->revert_tx_for_dblink_callback(tx_desc))) {
LOG_WARN("fail to recover tx for dblink callback", K(ret), K(tx_id));