[FEAT MERGE] Optimize dml performance in multi-local index scenarios
Co-authored-by: Handora <qcdsr970209@gmail.com> Co-authored-by: Naynahs <cfzy002@126.com> Co-authored-by: ZenoWang <wzybuaasoft@163.com>
This commit is contained in:
@ -730,31 +730,41 @@ int ObSqlTransControl::stmt_sanity_check_(ObSQLSessionInfo *session,
|
||||
ObPhysicalPlanCtx *plan_ctx)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
auto current_consist_level = plan_ctx->get_consistency_level();
|
||||
ObConsistencyLevel current_consist_level = plan_ctx->get_consistency_level();
|
||||
CK (current_consist_level != ObConsistencyLevel::INVALID_CONSISTENCY);
|
||||
bool is_plain_select = plan->is_plain_select();
|
||||
|
||||
// adjust stmt's consistency level
|
||||
if (OB_SUCC(ret)) {
|
||||
// Weak read statement with inner table should be converted to strong read.
|
||||
// For example, schema refresh statement;
|
||||
if (plan->is_contain_inner_table() ||
|
||||
(!is_plain_select && current_consist_level != ObConsistencyLevel::STRONG)) {
|
||||
(!plan->is_plain_select() && current_consist_level != ObConsistencyLevel::STRONG)) {
|
||||
plan_ctx->set_consistency_level(ObConsistencyLevel::STRONG);
|
||||
}
|
||||
}
|
||||
|
||||
// check isolation with consistency type
|
||||
if (OB_SUCC(ret) && session->is_in_transaction()) {
|
||||
// check consistency type volatile
|
||||
ObConsistencyLevel current_consist_level = plan_ctx->get_consistency_level();
|
||||
if (current_consist_level == ObConsistencyLevel::WEAK) {
|
||||
// read write transaction
|
||||
if (!session->get_tx_desc()->is_clean()) {
|
||||
plan_ctx->set_consistency_level(ObConsistencyLevel::STRONG);
|
||||
}
|
||||
}
|
||||
|
||||
// check isolation with consistency type
|
||||
auto iso = session->get_tx_desc()->get_isolation_level();
|
||||
auto cl = plan_ctx->get_consistency_level();
|
||||
if (ObConsistencyLevel::WEAK == cl && (iso == ObTxIsolationLevel::SERIAL || iso == ObTxIsolationLevel::RR)) {
|
||||
if (ObConsistencyLevel::WEAK == cl &&
|
||||
(iso == ObTxIsolationLevel::SERIAL || iso == ObTxIsolationLevel::RR)) {
|
||||
ret = OB_NOT_SUPPORTED;
|
||||
TRANS_LOG(ERROR, "statement of weak consistency is not allowed under SERIALIZABLE isolation",
|
||||
KR(ret), "trans_id", session->get_tx_id(), "consistency_level", cl);
|
||||
LOG_USER_ERROR(OB_NOT_SUPPORTED, "weak consistency under SERIALIZABLE and REPEATABLE-READ isolation level");
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user