plpgsql関数でアトミックトランザクションを確実にする方法と、データベースへのこの特定の変更に対して分離レベルが設定されている場所の明確化を求めています。
以下に示すplpgsql関数では、削除と挿入の両方が成功することを確認したいと思います。それらを単一のトランザクションでラップしようとすると、エラーが発生します。
ERROR: cannot begin/end transactions in PL/pgSQL
この関数がカスタム行を削除した後、カスタムを挿入する前に、別のユーザーが状況('RAIN'、'NIGHT'、 '45MPH')のデフォルトの動作を追加した場合、以下の関数の実行中に何が起こりますか行?別のユーザーがこの関数によって参照される行のいずれかを変更した場合に両方がロールバックされるように、挿入と削除をラップする暗黙のトランザクションはありますか?この関数の分離レベルを設定できますか?
create function foo(v_weather varchar(10), v_timeofday varchar(10), v_speed varchar(10),
v_behavior varchar(10))
returns setof CUSTOMBEHAVIOR
as $body$
begin
-- run-time error if either of these lines is un-commented
-- start transaction ISOLATION LEVEL READ COMMITTED;
-- or, alternatively, set transaction ISOLATION LEVEL READ COMMITTED;
delete from CUSTOMBEHAVIOR
where weather = 'RAIN' and timeofday = 'NIGHT' and speed= '45MPH' ;
-- if there is no default behavior insert a custom behavior
if not exists
(select id from DEFAULTBEHAVIOR where a = 'RAIN' and b = 'NIGHT' and c= '45MPH') then
insert into CUSTOMBEHAVIOR
(weather, timeofday, speed, behavior)
values
(v_weather, v_timeofday, v_speed, v_behavior);
end if;
return QUERY
select * from CUSTOMBEHAVIOR where ... ;
-- commit;
end
$body$ LANGUAGE plpgsql;