2017-02-20 140 views
1

我正在PostgreSQL數據庫上創建過程。我讀過的內容不可能在這些過程中使用回滾。爲什麼不能在PostgreSQL過程中使用Commit和回滾?

爲什麼?

是否可以使用提交?

我想這與ACID屬性有關,但如果我們在一個過程中有兩個插入操作會怎樣。如果第二個失敗,第二個失敗呢?

謝謝。

+0

首先,因爲Postgres沒有程序,只有函數。 –

回答

3

Postgres' overview通過解釋它們的功能是如何比傳統的存儲過程的不同給出一個提示:

Functions created with PL/pgSQL can be used anywhere that built-in functions could be used. For example, it is possible to create complex conditional computation functions and later use them to define operators or use them in index expressions.

這使得很難支持函數中交易的所有可能的情況。從the docs

Functions and trigger procedures are always executed within a transaction established by an outer query... However, a block containing an EXCEPTION clause effectively forms a subtransaction that can be rolled back without affecting the outer transaction.

如果你有一個函數的兩個刀片,第一個可以被包裹在一個EXCEPTION塊捕獲任何錯誤,並決定是否第二應該被執行。

1

你是對的。您不能從過程中回滾在過程之前啓動的事務。另外,在程序中也不能創建一個事務。您會收到此錯誤:

ERROR: cannot begin/end transactions in PL/pgSQL 
SQL state: 0A000 
Hint: Use a BEGIN block with an EXCEPTION clause instead. 

由於此錯誤狀態,正如馬特所說,您可以使用異常塊本質上執行回滾。從help

When an error is caught by an EXCEPTION clause, the local variables of the PL/pgSQL function remain as they were when the error occurred, but all changes to persistent database state within the block are rolled back.

或者,你可以從一個事務中調用過程,以及該滾回來,如果必要的。

相關問題