我正在PostgreSQL數據庫上創建過程。我讀過的內容不可能在這些過程中使用回滾。爲什麼不能在PostgreSQL過程中使用Commit和回滾?
爲什麼?
是否可以使用提交?
我想這與ACID屬性有關,但如果我們在一個過程中有兩個插入操作會怎樣。如果第二個失敗,第二個失敗呢?
謝謝。
我正在PostgreSQL數據庫上創建過程。我讀過的內容不可能在這些過程中使用回滾。爲什麼不能在PostgreSQL過程中使用Commit和回滾?
爲什麼?
是否可以使用提交?
我想這與ACID屬性有關,但如果我們在一個過程中有兩個插入操作會怎樣。如果第二個失敗,第二個失敗呢?
謝謝。
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塊捕獲任何錯誤,並決定是否第二應該被執行。
你是對的。您不能從過程中回滾在過程之前啓動的事務。另外,在程序中也不能創建一個事務。您會收到此錯誤:
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.
或者,你可以從一個事務中調用過程,以及該滾回來,如果必要的。
首先,因爲Postgres沒有程序,只有函數。 –