暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OB外健引发排它锁问题处理

IT那活儿 2025-01-20
124
点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!  

现 象

数据库内部大量锁等待,业务反馈非业务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=-6005ret=-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=-6005ret=-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=-6005ret=-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=0execute
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]


解决方案

3.1 建议去掉物理主外键关系,应用侧维护逻辑关系
3.2 建议避免有热点账号问题
3.3 可以酌情调大ob_query_timeout 以及 ob_trx_timeout参数,容忍可接受范围的耗时,避免应用感知报错(不推荐)


END


本文作者:刘浩楠(上海新炬中北团队)

本文来源:“IT那活儿”公众号

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

评论