对于更新锁postgresql 9.6

对于更新锁postgresql 9.6,postgresql,serialization,locking,postgres-9.6,Postgresql,Serialization,Locking,Postgres 9.6,当我使用“更新丢失”锁进行更新时,是否可以防止userdata列出现“更新丢失”问题 实际上,我一开始就想使用serializable isolation,但事实证明,在serializable isolation中,某些错误只有在commıt()之后才能检测到。您的代码将避免丢失的更新,但您可以通过一个简单的SQL语句实现这一点: CREATE OR REPLACE FUNCTION public.updatedata(userid_ integer) RETURNS integer AS $

当我使用
“更新丢失”
锁进行更新时,是否可以防止userdata列出现“更新丢失”问题


实际上,我一开始就想使用
serializable isolation
,但事实证明,在
serializable isolation
中,某些错误只有在commıt()之后才能检测到。

您的代码将避免丢失的更新,但您可以通过一个简单的SQL语句实现这一点:

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;
不可能有丢失的更新,因为第一次
更新
将以独占模式锁定行,并且任何并发的
更新
都必须等待持有锁定的事务完成,然后第一次
更新
的结果对第二次更新可见

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