我应该知道insert为啥插入被锁了。[捂脸]
在子表(包含外键的表)中插入数据时,OceanBase 数据库会检查父表中是否存在对应的外键值。
为了确保数据一致性,数据库会在父表中外键对应的行上加行锁。
而这个行锁可能被select for update阻塞住了。
看sqlaudit发现retry_cnt多的有上百次,少则10几次。
从ocp事务信息里面看到有大量select for update。
看到问题表有4个外键,3个指向自己的主键,一个指向另一张主表。这俩表都几百行,很小。
接着扒OBServer日志找到这条sql当时的信息,发现报错6005,还和指向另一张主表的外键有关。
最后想到了这个问题。
明天模拟一下试试[破涕为笑]真是曲折啊~不过经历一次确实成长了许多。
刚才我做了实验,发现这种确实会被锁住。
开发用的也不知道什么奇葩框架,select where id=xxx and rownum<n for update:去锁主表。
然后还做insert into values 往子表插数据。
5个机器并发,每个机器内部也有并发。导致这种诡异问题随机性发生。[破涕为笑]
1 个赞
有结果喇嘛
1 个赞
插入锁,一般来说大概是这样
1/ FK约束
2/ 有什么package/触发器做审计但是失效了中间某些环境
3/ bug
4/ 可能是存储问题
1 个赞