PostgreSQL 文档手册http://www.postgresql.org/docs/8.3/interactive/populate.html上的以下链接表明,要在 postgreSQL 中禁用自动提交,您只需将所有插入语句放在 BEGIN 中即可;和承诺;
但是,我很难捕获 BEGIN 之间可能发生的任何异常;犯罪; 如果发生错误(例如尝试插入重复的 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;
当使用这种技术时,我真的必须保证所有语句都会成功吗?为什么会这样?没有办法捕获错误并显式调用回滚吗?
谢谢