Answers:
您将需要一个所谓的“自主事务”(oracle提供的功能)。目前,这在PostgreSQL中还不可能。但是,您可以使用SAVEPOINT:
BEGIN;
INSERT ...
SAVEPOINT a;
some error;
ROLLBACK TO SAVEPOINT a;
COMMIT;
它不完全是一个自主交易,但是,它使您能够正确地进行“每笔交易”。您可以使用它来实现您对自动交易的期望。
否则,此时没有其他合理的解决方案。
PostgreSQL不支持子事务,但是该SAVEPOINT
功能可以有效地满足您的需求。从用于文档引用通过用先进接入层PG由维塔利Tomilov GitHub上:
PostgreSQL对嵌套事务没有适当的支持,它仅通过事务内部的保存点支持部分回滚。两种技术之间的差异非常大,如进一步说明。
对嵌套事务的正确支持意味着成功执行子事务的结果在回滚其父事务时不会回滚。但是对于PostgreSQL保存点,如果回滚顶层事务,则所有内部保存点的结果也会回滚。
保存点可用于部分回滚到活动事务中的较早点。例如,要建立一个保存点,然后撤消在建立保存点后执行的所有命令的效果:
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
COMMIT;
上面的事务将插入值1和3,但不插入2。有关SAVEPOINT
更多信息,请参见文档。
对于Postgresql 9.5或更高版本,您可以使用pg_background扩展提供的动态后台工作程序。它创建自主交易。请参考扩展的github页面。解决方案比db_link更好。PostgreSQL中有关于自治事务支持的完整指南。