適用於: .NET Framework
.NET
.NET 標準
交易是一組相關的工作;除其他特性外,它會作為一個整體,要嘛成功(認可),要嘛失敗(中止)。 「分散式交易」是影響幾個資源的交易。 若分散式交易要能提交,所有參與者都必須保證對資料所做的任何變更都將是永久性的。 不管系統是否當機,還是發生其他不可預見的事件,變更必須持續。 如果即使只有一個參與者無法提供此保證,整個交易就會失敗,而該交易範圍內對資料所做的任何變更都會回復原狀。
注意
如需 Azure SQL Database 和 Azure SQL 受控執行個體中分散式交易的相關資訊,請參閱跨雲端資料庫的分散式交易。
搭配 System.Transactions 使用
在 .NET 中,分散式交易是透過 System.Transactions 命名空間中的 API 管理。 當涉及多個持續性資源管理員時,System.Transactions API 會將分散式異動處理委派給異動監視器,如 Microsoft 分散式異動協調器 (MS DTC)。 如需詳細資訊,請參閱交易基礎觀念。
ADO.NET 2.0 支援使用 EnlistTransaction 方法在分散式交易中登記,該方法會在 Transaction 執行個體中登記連接。 在舊版的 ADO.NET 中,明確登錄分散式交易是使用連線的 EnlistDistributedTransaction 方法,將連線登錄至 ITransaction 執行個體中;此方法是為了支援回溯相容性。 如需 Enterprise Services 交易的詳細資訊,請參閱與 Enterprise Services 和 COM+ 交易的互通性。
當使用 Microsoft SqlClient Data Provider for SQL Server 對 SQL Server 資料庫執行 System.Transactions 交易時,將自動使用輕量型 Transaction。 然後,交易可視需要提升為完全分散式交易。 如需詳細資訊,請參閱 System.Transactions 與 SQL Server 的整合。
自動加入分散式交易
自動登錄是將 ADO.NET 連線與 System.Transactions 整合的預設(也是首選)方式。 如果連接物件確定交易處於作用中 (在 System.Transaction 詞彙中,表示 Transaction.Current 不為 Null),則會自動在現有分散式交易中登記。 當連線開啟時,系統會自動進行交易登錄。 之後即使在交易範圍內執行命令,也不會發生。 藉由指定 Enlist=false 作為 SqlConnection.ConnectionString 的連接字串參數,即可停用現有交易中的自動登錄。
手動加入分散式交易
如果停用了自動登錄,或是您需要登錄在開啟連線之後啟動的交易,則可以使用 Microsoft SqlClient Data Provider for SQL Server 之 EnlistTransaction 物件的 SqlConnection 方法,在現有的分散式交易中登錄。 加入現有的分散式交易可確保:如果該交易被提交或復原,則資料來源端程式碼所做的修改也會一併提交或復原。
注意
如果在交易仍處於作用中時啟動了 DataReader,那麼當您嘗試認可或回復該交易時,將會擲回例外狀況。
在集區化商務物件時,加入分散式交易會特別適用。 如果與開啟的連接共用商務物件,則僅當該連接開啟時,才會發生自動交易登記。 如果使用集區中的商務物件執行多個交易,則該物件已開啟的連線將不會自動加入新啟動的交易。 在此情況下,您可以停用該連線的自動交易加入功能,並使用 EnlistTransaction 將該連線加入交易。
EnlistTransaction 接受一個類型為 Transaction 的單一參數,該參數是現有交易的參考。 呼叫連接的 EnlistTransaction 方法之後,對使用連接之資料來源所做的所有修改都會包含在異動中。 傳遞 null 值會使該連線取消參與目前的分散式交易。 請注意,在呼叫 EnlistTransaction 之前,必須先開啟連接。
注意
一旦明確將連線登錄到某個交易中,在第一個交易完成之前,就無法將其取消登錄,也無法將其登錄到另一個交易中。
警告
如果連接已使用連接的 EnlistTransaction 方法啟動異動,則 BeginTransaction 會擲回例外狀況。 不過,如果異動是在資料來源上啟動的本機異動 (例如,使用 SqlCommand,明確執行 BEGIN TRANSACTION 陳述式),則 EnlistTransaction 將復原本機異動,並按要求在現有的分散式異動中登記。 您不會收到本機交易已回復的通知,且必須自行管理所有不是使用 BeginTransaction 啟動的本機交易。 如果您是將 Microsoft SqlClient Data Provider for SQL Server 用於 SQL Server,則嘗試登錄會擲回例外狀況。 所有其他情況都將無法被偵測到。
SQL Server 中的可提升交易
SQL Server 支援可升級交易,其中本機輕量型交易僅在需要時才會自動升級為分散式交易。 除非確實需要額外負荷,否則可升級交易不會引發分散式交易的額外負荷。 如需詳細資訊和範例程式碼,請參閱 System.Transactions 與 SQL Server 的整合。
設定分散式交易
您可能需要透過網路啟用 MS DTC,才能使用分散式異動。 如已啟用伺服器的本機 Windows 防火牆,您即必須允許 MS DTC 服務使用網路或開啟 MS DTC 連接埠。