Postgresql 引发异常时,回滚上一个成功事务
每当在update语句之后引发异常时,无论更新了什么,都会回滚该异常。 但是,即使异常引发了任何更新,也应该提交它。 请帮帮我Postgresql 引发异常时,回滚上一个成功事务,postgresql,Postgresql,每当在update语句之后引发异常时,无论更新了什么,都会回滚该异常。 但是,即使异常引发了任何更新,也应该提交它。 请帮帮我 create or replace function modifysal( p_empno IN NUMBER p_newsal IN NUMBER ) RETURNS VOID AS $body$ DECLARE p_error_message text ; p_context text; p_amount numeric:=5; v_sal numeric; beg
create or replace function modifysal(
p_empno IN NUMBER
p_newsal IN NUMBER
) RETURNS VOID AS $body$
DECLARE
p_error_message text ;
p_context text;
p_amount numeric:=5;
v_sal numeric;
begin
update emp set sal=p_newsal
where empno=p_empno;
if p_newsal >10000 then
p_error_message:= crt_error('highersalerror',p_newsal);
raise exception e'%',p_error_message;
end if;
when raise_exception then
commit;
GET STACKED DIAGNOSTICS
p_error_message = MESSAGE_TEXT,
p_context = PG_EXCEPTION_CONTEXT;
p_error_message := set_context(p_error_message, p_context);
raise exception e'%', p_error_message;
when others then
GET STACKED DIAGNOSTICS
p_error_message = MESSAGE_TEXT,
p_context = PG_EXCEPTION_CONTEXT;
p_error_message := set_context(p_error_message, p_context);
raise exception e'%', p_error_message;
end;
$body$ LANGUAGE PLPGSQL;
这是设计好的:如果您输入异常处理程序,那么
BEGIN
和EXCEPTION
之间的所有内容都将回滚
您必须添加更多的块,才能更好地控制回滚的内容:
BEGIN
UPDATE ...
BEGIN
RAISE EXCEPTION ...
EXCEPTION
WHEN ...
END;
END;
只有在必要时才使用带有
异常
子句的块,因为每个这样的块都会启动一个子事务,这非常昂贵。这就是事务的定义:要么所有语句都成功,要么没有。您能帮我如何处理此场景吗?您可以尝试使用保存点
s吗?