9.6

2017-01-06 1 views
0
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; 

은 내가, 유저 데이터 열에 대한 "lost update" 문제를 방지 할 수 있습니까?9.6

사실 난 처음에 serializable isolation를 사용하고 싶어하지만, serializable isolation에 약간의 오류 만 COMMIT 이후에 검출 할 수 있음을 밝혀 (link)

답변

0

당신의 잃어버린 업데이 트를 피할 코드,하지만 당신은 달성 할 수 간단한 SQL 문으로 같은 : 첫 번째 UPDATE 독점 모드에서 행을 고정하기 때문에

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

, 더 손실 업데이트가있을 수 있고, 어떤 동시 UPDATE이 잠금을 보유 트랜잭션이 완료 될 때까지 기다려야 할 것이다, 그리고 나서 입술 첫 번째 UPDATE의 ult가 두 번째 것이 표시됩니다.

+0

대단한 .... 감사합니다 .... – sommeguyy

관련 문제