共用方式為


使用 System.Transactions

適用於:SQL Server

System.Transactions 命名空間提供與 ADO.NET 和 SQL Server Common Language Runtime (CLR) 整合完全整合的交易架構。 System.Transactions.TransactionScope 類別會藉由隱含地在分散式交易中登記連接,來建立程式代碼區塊交易。 您必須在 TransactionScope 標示的程式代碼區塊結尾呼叫 Complete 方法。 當程式執行離開程式代碼區塊時,會叫用 Dispose 方法,如果未呼叫 Complete 方法,則會停止交易。 如果擲回導致程式代碼離開範圍的例外狀況,則會將交易視為已停止。

建議您使用using區塊,以確保在使用區塊結束時,在 TransactionScope 物件呼叫 Dispose 方法。 無法認可或回復擱置中的交易可能會嚴重降低效能,因為 TransactionScope 的預設逾時為一分鐘。 如果您不使用 using 語句,則必須在 Try 區塊中執行所有工作,並在 Finally 區塊中明確呼叫 Dispose 方法。

如果 TransactionScope發生例外狀況,交易會標示為不一致且已放棄。 在處置 TransactionScope,它會回復。 如果沒有發生任何例外狀況,則會認可參與的交易。

只有在存取本機和遠端數據源或外部資源管理員時,才應該使用 TransactionScope 。 這是因為 TransactionScope 一律會導致交易升級,即使它只用於內容連接內也一樣。

注意

TransactionScope 類別預設會使用 SerializableSystem.Transactions.Transaction.IsolationLevel 來建立交易。 根據應用程式,您可能會考慮降低隔離等級,以避免應用程式中發生劇烈的競爭現象。

注意

建議您只對遠端伺服器執行分散式交易內的更新、插入和刪除,因為它們會耗用大量的資料庫資源。 如果作業將在本機伺服器上執行,則不需要分散式交易,而且本機交易就已足夠。 SELECT 語句可能會不必要地鎖定資料庫資源,在某些情況下,可能需要使用交易進行選取。 除非交易涉及其他交易的資源管理員,否則任何非資料庫工作都應該在交易範圍之外完成。 雖然交易範圍內的例外狀況會防止交易認可, 但 TransactionScope 類別沒有針對復原程式代碼在交易本身範圍之外所做的任何變更布建。 如果您需要在回復交易時採取一些動作,您必須撰寫自己的 System.Transactions.IEnlistmentNotification 介面實作,並在交易中明確登記。

範例

若要使用 System.Transactions,您必須具有System.Transactions.dll檔案的參考。

下列程式代碼示範如何建立可針對兩個不同的 SQL Server 實例升級的交易。 這些實例是由兩個不同的 System.Data.SqlClient.SqlConnection 物件表示,這些物件會包裝在 TransactionScope 區塊中。 程序代碼會使用 using 語句建立 TransactionScope 區塊,並開啟第一個連接,這會自動在 TransactionScope登記它。 一開始交易登記為輕量型交易,而不是完全分散式交易。 程式代碼假設條件式邏輯存在(為了簡潔起見而省略)。 只有在需要時,才會開啟第二個連線,並將它登記在 TransactionScope。 開啟連接時,交易會自動升階為完整的分散式交易。 然後程式代碼會叫用 TransactionScope.Complete,以認可交易。 程序代碼會在結束 連接的 using 語句時處置這兩個連接。 TransactionScope 的 TransactionScope.Dispose 方法會在 TransactionScope 的 using 區塊終止時自動呼叫。 如果在 TransactionScope 區塊中的任何時間點擲回例外狀況,則不會呼叫 Complete,而分散式交易會在處置 TransactionScope回復。

Visual Basic

Using transScope As New TransactionScope()  
    Using connection1 As New SqlConnection(connectString1)  
        ' Opening connection1 automatically enlists it in the   
        ' TransactionScope as a lightweight transaction.  
        connection1.Open()  
  
        ' Do work in the first connection.  
  
        ' Assumes conditional logic in place where the second  
        ' connection will only be opened as needed.  
        Using connection2 As New SqlConnection(connectString2)  
            ' Open the second connection, which enlists the   
            ' second connection and promotes the transaction to  
            ' a full distributed transaction.  
            connection2.Open()  
  
            ' Do work in the second connection.  
  
        End Using  
    End Using  
  
    ' Commit the transaction.  
    transScope.Complete()  
End Using  

C#

using (TransactionScope transScope = new TransactionScope())  
{  
    using (SqlConnection connection1 = new   
       SqlConnection(connectString1))  
    {  
        // Opening connection1 automatically enlists it in the   
        // TransactionScope as a lightweight transaction.  
        connection1.Open();  
  
        // Do work in the first connection.  
  
        // Assumes conditional logic in place where the second  
        // connection will only be opened as needed.  
        using (SqlConnection connection2 = new   
            SqlConnection(connectString2))  
        {  
            // Open the second connection, which enlists the   
            // second connection and promotes the transaction to  
            // a full distributed transaction.   
            connection2.Open();  
  
            // Do work in the second connection.  
        }  
    }  
    //  The Complete method commits the transaction.  
    transScope.Complete();  
}  

另請參閱

CLR 整合和交易