在PostgreSQL中,交易是而不是自动回滚出错。
它被设置为中止状态,在此状态下,进一步的命令将失败并出现错误,直到您将事务重新传回。
观察:
regress=> BEGIN;
BEGIN
regress=> LOCK TABLE nosuchtable;
ERROR: relation "nosuchtable" does not exist
regress=> SELECT 1;
ERROR: current transaction is aborted, commands ignored until end of transaction block
regress=> ROLLBACK;
ROLLBACK
这一点很重要,因为它可以防止您意外执行一半的交易。试想一下,如果PostgreSQL自动回滚,允许发生新的隐式交易,而你试图运行下面的语句序列:
BEGIN;
INSERT INTO archive_table SELECT * FROM current_tabble;
DELETE FROM current_table;
COMMIT;
PostgreSQL将当它看到错字current_tabble
中止交易。所以DELETE
不会发生 - 所有语句错误后会被忽略,而COMMIT
被视为ROLLBACK
用于中止的事务:
regress=> BEGIN;
BEGIN
regress=> SELECT typo;
ERROR: column "typo" does not exist
regress=> COMMIT;
ROLLBACK
如果它,而不是自动回滚事务回来,它会像你跑:
BEGIN;
INSERT INTO archive_table SELECT * FROM current_tabble;
ROLLBACK; -- automatic
BEGIN; -- automatic
DELETE FROM current_table;
COMMIT; -- automatic
......不用说,可能会让你很不高兴。
很好的解释 – Matt 2014-12-02 08:52:53
为什么最后一次提交您的最后一个例子自动? – 2014-12-02 09:17:15
@ St.Antario如果没有明确的'BEGIN',PostgreSQL以自动提交模式运行语句。 – 2014-12-02 09:18:10