Следующая ссылка в руководстве по документации PostgreSQL http://www.postgresql.org/docs/8.3/interactive/populate.html гласит, что для отключения автокомпонента в postgreSQL вы можете просто разместить все инструкции вставки в BEGIN; и COMMIT;Заполнение базы данных в PostgreSQL
Однако мне трудно получить любые исключения, которые могут произойти между BEGIN; COMMIT; и если возникает ошибка (например, попытка вставить дубликат PK), я не могу явно вызвать команды ROLLBACK или COMMIT. Хотя все инструкции вставки автоматически откатываются назад, PostgreSQL все еще ожидает явного вызова команд COMMIT или ROLLBACK, прежде чем он сможет считать транзакцию прекращенной. В противном случае сценарий должен дождаться завершения транзакции, и любые выполненные после этого заявления вызовут ошибку.
В хранимой процедуре вы можете использовать предложение EXCEPTION для этого, но то же самое не применимо в моих обстоятельствах выполнения объемных вставок. Я попробовал и блок исключение не работает для меня, потому что/с выполняется следующее заявление после того, как ошибка происходит не в состоянии выполнить с ошибкой:
ERROR: current transaction is aborted, commands ignored until end of transaction block
Сделка остается открытым, поскольку он не был явно завершен с вызовом COMMIT или ROLLBACK;
Вот пример кода, я использовал, чтобы проверить это:
BEGIN;
SET search_path TO testing;
INSERT INTO friends (id, name) VALUES (1, 'asd');
INSERT INTO friends (id, name) VALUES (2, 'abcd');
INSERT INTO friends (id, nsame) VALUES (2, 'abcd'); /*note the deliberate mistake in attribute name and also the deliberately repeated pk value number 2*/
EXCEPTION /* this part does not work for me */
WHEN OTHERS THEN
ROLLBACK;
COMMIT;
При использовании такой техники у меня действительно есть, чтобы гарантировать, что все заявления будут иметь успех? Почему это так? Разве нет способа уловить ошибки и явно вызвать откат?
Спасибо
Все заявления откатываются, и это право; Однако транзакция не считается завершенной, и любые заявления, которые планируется выполнить после этого, не выполняются, потому что вышеупомянутая ошибка возникает с каждым новым выражением; – prince
Что вы планируете делать? Если есть другие данные, которые должны быть вставлены независимо от предыдущих сбоев, вы должны добавить их в другой блок begin-commit. – FooLman