在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