GaussDB分区表业务锁问题

举报
GaussDB 数据库 发表于 2025/12/09 11:17:14 2025/12/09
【摘要】 故障现象使用分区表业务,出现等锁超时。使用分区表业务,出现死锁。故障原因可能原因有以下:事务块/存储过程中同时进行分区DDL、DML等混合业务在一个分区DDL命令中执行多个DDL操作进行合并分区等同时作用多个源分区的操作处理方法步骤 1     在在《特性指南》中“分区表 > 分区表并发控制”章节给出了分区表表锁、分区锁的设计规格,可以参考对应资料部分进行定位和排查。步骤 2     判断是...
  • 故障现象

使用分区表业务,出现等锁超时。

使用分区表业务,出现死锁。

  • 故障原因

可能原因有以下:

事务块/存储过程中同时进行分区DDLDML等混合业务

在一个分区DDL命令中执行多个DDL操作

进行合并分区等同时作用多个源分区的操作

  • 处理方法

步骤 1     在在《特性指南》中“分区表 > 分区表并发控制”章节给出了分区表表锁、分区锁的设计规格,可以参考对应资料部分进行定位和排查。

步骤 2     判断是否在事务块/存储过程中同时进行分区DDLDML等混合业务。

步骤 3     事务块/存储过程中执行的混合业务,会依次给业务作用的表、分区加上对应业务级别的锁。如果业务设计不合理,可能会导致互锁,出现死锁场景;如果在事务块/存储过程中同时进行分区DDLDML等混合业务,会持有目标分区锁直到事务/存储过程结束,其他并发业务会持续等锁,可能出现锁超时场景。

步骤 4     下面的业务就会出现死锁场景:

--业务一:
begin;
delete from t1 partition (p1);
alter table t1 truncate partition p2 update global index;
commit; 
--业务二:
begin;
delete from t1 partition (p2);
alter table t1 truncate partition p1 update global index;
commit;

步骤 5     下面的业务会持锁到事务结束:

begin;
alter table t1 truncate partition p2 update global index;
copy t1 from '/home/omm/test.dat';
commit;

步骤 6     判断是否在一个分区DDL命令中执行多个DDL操作。

步骤 7     如果在一个分区DDL命令中先后对不同分区进行DDL操作,会依次给不同分区加写锁。如果并发的DQL/DML恰好作用在这些分区,且顺序相反,就可能出现死锁场景。

步骤 8     下面的并发业务就会出现死锁场景:

--业务一:
alter table t1 truncate partition p2, truncate partition p1;
--业务二:
delete from t1; --先扫描p1,再扫描p2

步骤 9     判断是否进行了合并分区等同时作用多个源分区的操作。

步骤 10    这种场景下的死锁原因与上面场景是一样,也是由于串行加锁导致的。

步骤 11    业务原因导致的锁超时/死锁,需要分析业务模型,对业务进行改造。

----结束

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。