增量数表postgresql线程安全

时间:2018-10-12 02:27:13

标签: multithreading postgresql function

我正在创建一个线程安全的函数。 我想让数字增加“ p_sitename”和“ p_sourcename”。

CREATE OR REPLACE FUNCTION public.fn_ppp(
p_sitename character varying,
p_sourcename character varying)
RETURNS integer
LANGUAGE 'plpgsql'

COST 100
VOLATILE 
AS $BODY$

declare
    res integer ;
begin
lock table std_seq in access exclusive mode;

update 
    std_seq
set 
    post_id = (
    select 
        post_id + 1 into res
    from 
        std_seq
    where 
        sitename   = p_sitename   and 
        sourcename = p_sourcename
    limit 1
    )
where 
    sitename   = p_sitename   and
    sourcename = p_sourcename ;
return res;
end; 

$BODY$;

错误消息是

ERROR:  INTO used with a command that cannot return data
CONTEXT:  PL/pgSQL function fn_ppp(character varying,character varying) line 
8 at SQL statement
SQL state: 42601

为什么不呢?

1 个答案:

答案 0 :(得分:1)

SELECT ... INTO不能在子查询中,只能在顶层。

但是您可以使用UPDATE ... RETURNING轻松地完成自己想做的事情:

UPDATE std_seq
SET post_id = post_id + 1
WHERE sitename = p_sitename
  AND sourcename = p_sourcename
RETURNING post_id INTO res;

由于所有事情都在一条语句中发生,因此根本不需要显式锁定表。 每次使用同一事务调用相同功能的并发事务都将被阻止,直到完成事务为止,并且不会发生重复。

该表应在(sitename, sourcename, post_id)上具有主键约束。这样可以防止重复,但也可以加快UPDATE的速度。