#postgresql #transactions
Вопрос:
Я новичок в Postgresql и пытаюсь сделать что-то очень простое с Oracle.
Я создал процедуру с простым кодом внутри :
CREATE OR REPLACE PROCEDURE user.test_proc(IN param1 character varying)
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
i text;
BEGIN
if param1 = '1' then
insert into amian.test values ('1', '1');
rollback;
else
insert into amian.test values('2','2');
commit;
end if;
end;
$BODY$;
Из среды unix я использую psql :
psql –p port–d base–U user
set AUTOCOMMIT off
call user.test_proc('2');
У меня есть эта ошибка, когда программа выполняет ФИКСАЦИЮ :
invalid transaction termination
Что случилось ? что мне делать (я хочу быть с отключенной автоматической фиксацией) ?
Спасибо
Ответ №1:
Вы можете использовать COMMIT
и ROLLBACK
в процедуре только в том случае, если процедура выполняется в своей собственной транзакции (режим автоматической фиксации). Смотрите эту цитату из документации:
Если
CALL
выполняется в блоке транзакций, то вызываемая процедура не может выполнять инструкции управления транзакциями. Инструкции по управлению транзакциями разрешены только в том случае, еслиCALL
они выполняются в собственной транзакции.
Отключение автоматической фиксации psql
приводит к тому, что клиент отправляет сообщение BEGIN
до CALL
выписки, так что вы находитесь в явно запущенной транзакции. Это и вызывает проблему.
Это ограничение может быть снято в какой-то момент в будущем, но в настоящее время так оно и есть.
Не отключайте автоматическую фиксацию. Вы рискуете совершать длительные транзакции, которые могут ухудшить работоспособность вашей базы данных.
Комментарии:
1. Итак, вы говорите, что каким-то образом это ошибка postgresql. Что я должен оставить включенной автоматическую фиксацию и пойти на риск того, что некоторые запросы (вставка или обновление) будут зафиксированы, хотя я этого не хочу, потому что я забуду фиксацию, которая ставит под угрозу базу данных ?
2. Это не ошибка PostgreSQL. Это ограничение функциональности PG, как и многих других: вложенные транзакции, незафиксированные чтения, транзакции DDL… Прочитайте статью, которую я написал об отсутствии функциональных возможностей… mssqlserver.fr/… ,
3. @mlwacosmos Это не ошибка, она работает так, как описано (см. Мою добавленную цитату). Извини, если тебе это не нравится.