diff --git a/src/observer/mysql/ob_query_retry_ctrl.cpp b/src/observer/mysql/ob_query_retry_ctrl.cpp index 0bfbafed56..594606d68d 100644 --- a/src/observer/mysql/ob_query_retry_ctrl.cpp +++ b/src/observer/mysql/ob_query_retry_ctrl.cpp @@ -560,7 +560,9 @@ public: // sql which in pl will local retry first. see ObInnerSQLConnection::process_retry. // sql which not in pl use the same strategy to avoid never getting the lock. if (v.is_from_pl_) { - if (v.local_retry_times_ <= 1 || !v.session_.get_pl_can_retry()) { + if (v.local_retry_times_ <= 1 || + !v.session_.get_pl_can_retry() || + ObSQLUtils::is_in_autonomous_block(v.session_.get_cur_exec_ctx())) { v.no_more_test_ = true; v.retry_type_ = RETRY_TYPE_LOCAL; } else { diff --git a/src/sql/ob_sql_utils.cpp b/src/sql/ob_sql_utils.cpp index 82c677729a..496e412803 100644 --- a/src/sql/ob_sql_utils.cpp +++ b/src/sql/ob_sql_utils.cpp @@ -4473,6 +4473,21 @@ bool ObSQLUtils::is_nested_sql(ObExecContext *cur_ctx) return is_pl_nested_sql(cur_ctx) || is_fk_nested_sql(cur_ctx); } +bool ObSQLUtils::is_in_autonomous_block(ObExecContext *cur_ctx) +{ + bool bret = false; + pl::ObPLContext *pl_context = nullptr; + if (cur_ctx != nullptr) { + pl_context = cur_ctx->get_pl_stack_ctx(); + for (; !bret && pl_context != nullptr; pl_context = pl_context->get_parent_stack_ctx()) { + if (pl_context->in_autonomous()) { + bret = true; + } + } + } + return bret; +} + bool ObSQLUtils::is_select_from_dual(ObExecContext &ctx) { bool bret = false; diff --git a/src/sql/ob_sql_utils.h b/src/sql/ob_sql_utils.h index 08078b6db6..afc2610f83 100644 --- a/src/sql/ob_sql_utils.h +++ b/src/sql/ob_sql_utils.h @@ -581,6 +581,7 @@ public: static bool is_fk_nested_sql(ObExecContext *cur_ctx); static bool is_iter_uncommitted_row(ObExecContext *cur_ctx); static bool is_nested_sql(ObExecContext *cur_ctx); + static bool is_in_autonomous_block(ObExecContext *cur_ctx); static bool is_select_from_dual(ObExecContext &ctx); static int get_obj_from_ext_obj(const ObObjParam &ext_obj, int64_t pos, ObObj *&obj);