在某些情況下,可能需要成功地對數據庫執行所有更新,也可能需要在發生錯誤時根本不執行任何更新。一組數據庫更新將作為單個單元成功執行,或者根本不執行,這被稱為事務。

銀行業務的一個常見例子是兩個賬戶之間的資金轉賬。事務的兩個部分是從一個賬戶取走資金和將資金存入另一個賬戶。此事務的兩個部分都必須發生,否則銀行的賬簿將失去平衡。存款和取款是一個事務。

如果滿足以下條件,則可以創建使用與 Oracle 數據庫兼容的事務控制樣式的 SPL 應用程序:

  • polar_comp_stmt_level_tx參數必須設置為 TRUE。這會阻止在發生異常時執行無條件回滾 BEGIN/END 塊內的所有數據庫更新的操作。
  • 應用程序不得在自動提交模式下運行。如果自動提交模式打開,則會立即提交每個成功的數據庫更新,并且無法撤消。打開或關閉自動提交模式的方式取決于應用程序。

事務在 SPL 程序中遇到第一個 SQL 命令時開始。所有后續的 SQL 命令都包含在該事務中。當發生以下任一情況時,事務就會結束:

  • 發生未處理的異常,在這種情況下,事務期間執行的所有數據庫更新的效果都將回滾,并且事務將中止。
  • 遇到 COMMIT 命令,在這種情況下,事務期間執行的所有數據庫更新的效果都將成為永久性的。
  • 遇到 ROLLBACK 命令,在這種情況下,事務期間執行的所有數據庫更新的效果都將回滾,事務將中止。如果遇到一個新的 SQL 命令,便會開始新的事務。
  • 控制權返回調用應用程序(如 Java、PSQL 等),在這種情況下,應用程序的操作確定是提交還是回滾事務;除非事務位于聲明了 PRAGMA AUTONOMOUS_TRANSACTION 的塊內,在這種情況下,事務的提交或回滾獨立于調用程序執行。
說明 與 Oracle 不同的是,DDL 命令(如 CREATETABLE)不隱式在其自己的事務中執行。因此,DDL 命令不會像在 Oracle 中那樣自動導致立即數據庫提交,但 DDL 命令可像 DML 命令一樣回滾。

事務可跨一個或多個 BEGIN/END 塊,單個 BEGIN/END 塊也可包含一個或多個事務。

以下各節將更詳細地講述 COMMIT 和 ROLLBACK 命令。