现 象
数据库内部大量锁等待,业务反馈非业务SQL:
select /*+ no_parallel */ 1 from "JKZYX"."CURRCODE" where "CURRCODE" = '1' and rownum <= 2 for update
现象关键点,可根据该现象rownum <= 2 for update. 该后缀为OB内部拼接SQL。
原 因
从数据库内部日志来看,大量-6005报错:

(错误码见:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218686)。其中check_exist 函数为检测行是否存在且锁住。
该问题的根本原因为OB内部对外建引用父表行加了拍他锁(for update),导致对子表的操作会存在等待情况。
53376:[2023-11-1416:37:38.090037] WARN [SERVER] query
(ob_inner_sql_connection.cpp:890) [1256524][0][YB421541287A-000609CF29894C30-0-0] [lt=6] [dc=0] failed to process
retry(tmp_ret=-6005, ret=-6005, executor={ObIExecutor:,
sql:"select *+ no_parallel */ 1 from "JKZYX"."CURRCODE" where "CURRCODE" = '1' and rownum <= 2 for update"}, retry_cnt=0)
53380:[2023-11-1416:37:38.090093] WARN [SERVER] query
(ob_inner_sql_connection.cpp:921) [1256524][0][YB421541287A-000609CF29894C30-0-0] [lt=5] [dc=0] failed to process
record(executor={ObIExecutor:, sql:"select *+ no_parallel */ 1 from "JKZYX"."CURRCODE" where "CURRCODE" = '1' and
rownum <= 2forupdate"},
record_ret=-6005, ret=-6005)
53381:[2023-11-1416:37:38.090102] WARN [SERVER] query
(ob_inner_sql_connection.cpp:943) [1256524][0][YB421541287A-000609CF29894C30-0-0] [lt=7] [dc=0] failed to process
final(executor={ObIExecutor:, sql:"select *+ no_parallel */ 1 from "JKZYX"."CURRCODE" where "CURRCODE" = '1' and rownum
<= 2forupdate"},
aret=-6005, ret=-6005)
53383:[2023-11-1416:37:38.090109] WARN [SERVER]
execute_read (ob_inner_sql_connection.cpp:1445) [1256524][0][YB421541287A-000609CF29894C30-0-0] [lt=5] [dc=0] execute
sql failed(ret=-6005, tenant_id=1014, sql=select *+
no_parallel */ 1 from "JKZYX"."CURRCODE" where "CURRCODE" = '1'and rownum <= 2forupdate)
53384:[2023-11-1416:37:38.090115] WARN [SERVER]
execute_read (ob_inner_sql_connection.cpp:1462) [1256524][0][YB421541287A-000609CF29894C30-0-0] [lt=4] [dc=0]
execute_read failed(ret=-6005, tenant_id=1014, sql="select *+ no_parallel */ 1 from "JKZYX"."CURRCODE" where
"CURRCODE" = '1'and rownum <= 2forupdate")
53385:[2023-11-1416:37:38.090119] WARN [SQL.ENG]
execute_read (ob_table_modify.cpp:387) [1256524][0][YB421541287A-000609CF29894C30-0-0] [lt=3] [dc=0] failed to
execute sql(ret=-6005, tenant_id_=1014, sql="select *+
no_parallel */ 1 from "JKZYX"."CURRCODE" where "CURRCODE" = '1'and rownum <= 2forupdate")
53386:[2023-11-1416:37:38.090125] WARN [SQL.ENG]
check_exist (ob_table_modify.cpp:2507) [1256524][0][YB421541287A-000609CF29894C30-0-0] [lt=5] [dc=0] failed to
execute stmt(ret=-6005, stmt_buf="select *+ no_parallel */
1 from "JKZYX"."CURRCODE" where "CURRCODE" = '1'and rownum <= 2forupdate")
53406:[2023-11-1416:37:38.090596] TRACE
[TRACE]obmp_base.cpp:156 [1256524][0][YB421541287A-000609CF29894C30-0-0]
解决方案

本文作者:刘浩楠(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




