Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 增量数字表postgresql线程安全_Multithreading_Postgresql_Function - Fatal编程技术网

Multithreading 增量数字表postgresql线程安全

Multithreading 增量数字表postgresql线程安全,multithreading,postgresql,function,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 ; beg

我正在创建一个线程安全函数。 我想让数字以“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

为什么不呢?

选择。。。INTO不能位于子查询中,只能位于顶层

但是你可以通过
UPDATE轻松地做你想做的事情。。。返回

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\u id)
上具有主键约束。这将防止重复,但也可能加快
更新

选择。。。INTO
不能位于子查询中,只能位于顶层

但是你可以通过
UPDATE轻松地做你想做的事情。。。返回

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\u id)
上具有主键约束。这将防止重复,但也可能加快更新速度