控制交易 (Database Engine)

應用程式主要是透過指定交易何時啟動及結束來控制交易。這可利用 Transact-SQL 陳述式或資料庫應用程式設計介面 (API) 函數來指定。系統也必須能夠正確地處理交易完成之前便結束交易的錯誤。

依照預設,會在連接層級管理交易。在連接上啟動交易時,連接上執行的所有 Transact-SQL 陳述式在交易結束之前都是該交易的一部分。但是,在 Multiple Active Result Set (MARS) 工作階段下,Transact-SQL 明確或不明確交易會成為在批次層級管理的批次範圍交易。當批次完成時,如果未認可或回復批次範圍的交易,SQL Server 會自動回復它。

啟動交易

使用 API 函數和 Transact-SQL 陳述式,您可以在 SQL Server Database Engine 的執行個體中,以明確、自動認可或隱含來啟動交易。在 MARS 工作階段下,Transact-SQL 明確和隱含交易會成為批次範圍交易。

  • 外顯交易
    透過 API 函數或發出 Transact-SQL BEGIN TRANSACTION 陳述式,明確啟動交易。

  • 自動認可交易
    Database Engine 的預設模式。每一個別 Transact-SQL 陳述式在完成時便會認可。您不必指定任何陳述式來控制交易。

  • 隱含交易
    透過 API 函數或 Transact-SQL SET IMPLICIT_TRANSACTIONS ON 陳述式,可將隱含交易模式設為開啟。下一個陳述式會自動啟動一筆新的交易。當該筆交易完成時,下一個 Transact-SQL 陳述式又會啟動一筆新的交易。

  • 批次範圍交易
    只適用於 Multiple Active Result Set (MARS),在 MARS 工作階段下啟動的 Transact-SQL 明確或隱含交易會變成批次範圍的交易。當批次完成時,SQL Server 會自動回復未認可或回復之批次範圍的交易。

交易模式的管理在連接層級進行。一個連接從一種交易模式變更為另一種交易模式,其他任何連接的交易模式不會受到影響。

結束交易

您可以使用 COMMIT 或 ROLLBACK 陳述式,或透過 API 函數來結束交易。

  • COMMIT
    交易如果成功便會認可交易。COMMIT 陳述式可以保證交易所做的全部修改,都會變成資料庫永久的一部分。COMMIT 同時也會釋放資源,例如交易所使用的鎖定。

  • ROLLBACK
    如果交易中發生錯誤,或是使用者決定取消交易,便會將交易回復。ROLLBACK 陳述式藉由將資料帶回到交易啟動時的狀態,來取消交易中進行的所有修改動作。ROLLBACK 也會釋放交易所佔用的資源。

[!附註]

在啟用支援 Multiple Active Result Set (MARS) 的連線下,當執行有擱置的要求時,無法認可透過 API 函數啟動的明確交易。仍有未處理作業在執行時,任何嘗試認可此類型的要求將會導致錯誤。

指定交易界限

您可以使用 Transact-SQL 陳述式或 API 函數與方法,來識別 Database Engine 交易何時啟動與結束。

  • Transact-SQL 陳述式
    使用 BEGIN TRANSACTION、COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION、ROLLBACK WORK 與 SET IMPLICIT_TRANSACTIONS 陳述式來描述交易。這些主要是用在 DB-Library 應用程式及 Transact-SQL 指令碼,例如使用 osql 命令提示公用程式來執行的指令碼。

  • API 函數與方法
    資料庫 API,如 ODBC、OLE DB、ADO 以及 .NET Framework SQLClient 命名空間,都包含用來描述交易的函數或方法。這些都是在 Database Engine 應用程式中用來控制交易的主要機制。

每一筆交易只能透過上述其中一種方法來管理。在同一筆交易中同時使用兩種方法可能導致未定義的結果。例如,您不可使用 ODBC API 函數來啟動一筆交易,然後再用 Transact-SQL COMMIT 陳述式來完成這筆交易。這麼做將無法通知 SQL Server ODBC 驅動程式交易已經被認可。在這種情況下,請用 ODBC SQLEndTran 函數來結束交易。

交易處理期間的錯誤

如果因為錯誤而讓交易無法順利完成,SQL Server 會自動回復交易,並釋放交易所佔用的一切資源。如果用戶端與 Database Engine 執行個體之間的網路連接已中斷,該連接尚未處理完畢的交易會在網路通知該執行個體發生中斷時全部回復。如果用戶端應用程式失敗或是用戶端電腦當機或重新啟動,也會中斷連接,Database Engine 執行個體會在網路通知已發生中斷時,回復所有尚未處理完畢的連接。如果用戶端從應用程式登出,便會復原任何尚未處理完畢的交易。

如果批次中發生執行階段陳述式錯誤 (例如條件約束違規),Database Engine 的預設行為是只回復產生錯誤的陳述式。您可以使用 SET XACT_ABORT 陳述式來變更這個行為。在 SET XACT_ABORT ON 執行之後,任何執行時期陳述式錯誤都會讓目前的交易自動回復。SET XACT_ABORT 不會影響到如語法錯誤之類的編譯錯誤。如需詳細資訊,請參閱<SET XACT_ABORT (Transact-SQL)>。

發生錯誤時,更正動作 (COMMIT 或 ROLLBACK) 應該包括在應用程式碼中。處理錯誤的有效工具之一 (包括交易中的那些錯誤) 是 Transact-SQL TRY…CATCH 建構。如需有關包含交易之範例的詳細資訊,請參閱<在 Transact-SQL 中使用 TRY...CATCH>和<TRY...CATCH (Transact-SQL)>。