транзакция с postgresql

#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 Это не ошибка, она работает так, как описано (см. Мою добавленную цитату). Извини, если тебе это не нравится.