Я ищу разъяснения о том, как обеспечить атомную транзакцию в функции 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