2014-12-02 19 views
2

我使用PostgreSQL 9.3爲什麼我們應該明確地在sql中使用回滾?

我對交易以及它們是如何工作有一個誤解。假設我們在如下事務中包裝了一些SQL運算符:

BEGIN; 
    insert into tbl (name, val) VALUES('John', 'Doe'); 
    insert into tbl (name, val) VALUES('John', 'Doee'); 
COMMIT; 

如果出現問題,交易將自動回滾。考慮到這一點,我不能明確什麼時候應該使用ROLLBACK?有必要的時候可以舉個例子嗎?

回答

5

在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 

......不用說,可能會讓你很不高興。

+0

很好的解釋 – Matt 2014-12-02 08:52:53

+0

爲什麼最後一次提交您的最後一個例子自動? – 2014-12-02 09:17:15

+0

@ St.Antario如果沒有明確的'BEGIN',PostgreSQL以自動提交模式運行語句。 – 2014-12-02 09:18:10

0

顯式ROLLBACK其他用途手動修改和測試案例:

  • 做一些更改數據(UPDATEDELETE ...)。
  • 運行SELECT用於檢查數據修改結果的語句。如果結果不符合預期,則執行ROLLBACK

在Postgres的數據庫,你甚至可以使用DDL語句做到這一點(CREATE TABLE,...)

相關問題