当连接多个用户时,我想检索一个字段的值并在 Informix 12.1 中安全地递增它。
我在 C 术语中想要的是lastnumber = counter++;
在并发环境中。
文档提到了这样做的一种方法,即让每个人都使用等待参数连接、锁定行、读取数据、增加数据并释放锁定。
所以这就是我尝试的:
begin work;
select
lastnum
from tbllastnums
where id = 1
for update;
而且我可以看到该行被锁定,直到我提交或结束我的会话。
但是,当我将其放入存储过程中时:
create procedure "informix".select_for_update_test();
define vLastnum decimal(15);
begin work;
select
lastnum
into vLastnum
from tbllastnums
where id = 1
for update;
commit;
end procedure;
数据库给了我一个语法错误。(用不同的编辑器尝试过)那么为什么for update
在存储过程中编写子句会出现语法错误?有没有替代方案?
编辑
这就是我最终得到的结果:
DROP TABLE if exists tstcounter;
^!^
CREATE TABLE tstcounter
(
id INTEGER NOT NULL,
counter INTEGER DEFAULT 0 NOT NULL
)
EXTENT SIZE 16
NEXT SIZE 16
LOCK MODE ROW;
^!^
ALTER TABLE tstcounter
ADD CONSTRAINT PRIMARY KEY (id)
CONSTRAINT tstcounter00;
^!^
insert into tstcounter values(1, 0);
^!^
select * from tstcounter;
^!^
drop function if exists tstgetlastnumber;
^!^
create function tstgetlastnumber(pId integer)
returning integer as lastCounter
define vCounter integer;
foreach curse for
select counter into vCounter from tstcounter where id = pId
update tstcounter set counter = vCounter + 1 where current of curse;
return vCounter with resume;
end foreach;
end function;
^!^