首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增量数字表postgresql线程安全

增量数字表postgresql线程安全
EN

Stack Overflow用户
提问于 2018-10-12 02:27:12
回答 1查看 511关注 0票数 0

我正在创建一个线程安全函数。我希望这个数字由'p_sitename‘和'p_sourcename’递增。

代码语言:javascript
复制
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$;

错误信息是

代码语言:javascript
复制
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

为什么不行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-12 03:59:16

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

但是你可以很容易地用UPDATE ... RETURNING做你想做的事

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52771336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档