繁体   English   中英

FOR UPDATE锁PostgreSQL 9.6

[英]FOR UPDATE lock postgresql 9.6

CREATE OR REPLACE FUNCTION public.updatedata(userid_ integer)
RETURNS integer
AS $$
DECLARE
userdata_ integer;
BEGIN

LOOP
BEGIN
     PERFORM 1 FROM public.footable f WHERE f.userid=userid_ LIMIT 1 FOR UPDATE ;
    userdata_:=(SELECT f.userdata FROM public.footable f WHERE f.userid=userid_  );
    UPDATE public.footable f SET userdata = userdata_ + 1 WHERE f.userid=userid_ ;
EXIT ;
EXCEPTION WHEN others THEN
END;
END LOOP;

RETURN userdata_ + 1;
EXCEPTION WHEN others THEN
END $$ language plpgsql;

当我像这样使用"FOR UPDATE"锁时,是否可以防止userdata列出现"lost update"问题?

实际上,我首先想使用可serializable isolation ,但是事实证明,在可serializable isolation某些错误只能在commıt( link )之后才能检测到

您的代码将避免丢失更新,但是您可以使用简单的SQL语句实现相同的目的:

UPDATE public.footable f
SET userdata = userdata + 1
WHERE f.userid = userid_
RETURNING userdata;

更新不会丢失,因为第一个UPDATE将以独占模式锁定该行,并且任何并发的UPDATE将必须等到持有该锁的事务完成后,第二个UPDATE的结果才可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM