对于更新锁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;