我有此处显示的 SINGLESTORE 存储过程,它在插入 800 万行时进入行锁。插入60k-80k,运行正常。
我收到的错误如下。我不确定,如何更改此查询并分块运行以避免锁定。有人可以建议我更好的解决方案吗?我希望它逐行运行但没有锁。
call name('ABC');
发现行锁冲突(属于节点x中的连接62269。35秒后重试语句,插入GG......)
create or replace procedure name (prcs) returns void as
declare
R query(id text, cd txt, date timetamp(6), date_2 timestamp(6));
r_arr array(record(id text, cd txt, date timetamp(6), date_2 timestamp(6)));
tbnm=varchar(25);
exception_message text='';
begin
if prcs ='A' then
tbnm='X';
R=select X.id , X.cd , X.date, Z.date_2 from X inner join z on X.id=z.id;
else
tbnm='Y';
R=select Y.id , Y.cd , Y.date, Z.date_2 from Y inner join z on Y.id=z.id;
endif;
r_arr=collect(r);
for record in r_arr loop
if record.cd='I' and record.date_2>=record.date1
then
execute immediate concat('insert into log_tbl values (current_timestamp, prcs, record.id, record.cd, 'Reject')');
end if;
if
(record.cd='I' and record.date_2<record.date)
then
begin
execute immediate concate('insert into GG select * /*all columns*/
from 'tbnm' x where x.id=record.id');
exception
when others then
begin
exception_message=exception_message();
exception_message=replace(replace(exception_message,'`',''),'\'','');
excecute immedate concat('insert into log_tbl values(current_timestamp, prcs, record.id, record.cd, 'Fail')');
end;
end if;
end loop;
end;
我尝试过将表名称作为输入参数传递,但效果不佳。我觉得插入语句有问题。
您需要看看这是什么
62269
正在运行。
从 information_schema.mv_processlist 中选择*; 看看这个62269在做什么。
并且可以增加超时时间。