如果 Connection 物件判斷有作用中的交易,便會自動在現有分散式交易中登記。自動交易登記發生於連接開啟或從連接共用擷取連接時。您可以藉由指定 Enlist=false 作為 SqlConnection 的連接字串參數,或指定 OLE DB Services=-7 作為 OleDbConnection 的連接字串參數的方法,停用現有交易中的自動登記。
如果停用自動登記,可以使用 Connection 物件的 EnlistDistributedTransaction 方法在現有分散式交易中登記。在現有分散式交易中登記可確保如果交易認可或復原時,對資料來源所作的修改也會加以認可或復原。
EnlistDistributedTransaction 在共用商務物件 (Business Object) 時特別適用。如果商務物件是透過開放連接而共用,那麼只有在連接為開啟或從連接共用抽出連接時,才會發生自動交易登記。如果使用共用的商務物件執行多個交易,該物件的開啟連接將不會自動在新初始化的交易中進行登記。在這種情況下,您可以停用 Connection 的自動交易登記,並使用 EnlistDistributedTransaction 在交易中登記 Connection。
EnlistDistributedTransaction 會採用型別 ITransaction 的單一引數,該引數是現有交易的參考。呼叫 Connection.EnlistDistributedTransaction 後,使用 Connection 對資料來源的所有修改會包含在交易中。
****注意 Connection 必須在呼叫 EnlistDistributedTransaction 前先開啟。
**警告 **如果 Connection 已經使用 BeginTransaction 先行開始交易,EnlistDistributedTransaction 就會傳回 Exception。然而,如果交易是從資料來源啟動的邏輯交易 (例如,使用 SqlCommand 明確執行 BEGIN TRANSACTION 陳述式),EnlistDistributedTransaction 便會復原邏輯交易,並在現有分散式交易中如要求般登記。您不會收到說明本機交易已復原的注意訊息,而且必須負責管理任何並非使用 BeginTransaction 而開始的本機交易。
下列範例顯示要求交易的 ASP.NET 網頁。網頁內的 ADO.NET 程式碼登記在交易中。
<%@Page Transaction="Required" %>
<%@Import Namespace="System.Data"%>
<%@Import Namespace="System.Data.SqlClient"%>
<%@Import Namespace="System.EnterpriseServices"%>
<html>
<Script Runat="SERVER" Language="VB">
Sub Page_Load()
Dim ns As NorthwindSample = New NorthwindSample()
Dim customerId As String = "CUST1"
Dim companyName As String = "New Company Name"
Try
ns.AddCustomer(customerId, companyName, CType(ContextUtil.Transaction, ITransaction))
ContextUtil.SetComplete()
Response.Write("Customer " & Server.HtmlEncode(customerId) & " added.")
Catch e As Exception
ContextUtil.SetAbort()
Response.Write("Customer " & Server.HtmlEncode(customerId) & " not added. An exception of type " & _
e.GetType().ToString() & " was encountered.")
End Try
End Sub
Public Class NorthwindSample
Public Sub AddCustomer(customerId As String, companyName As String, trans As ITransaction)
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;" & _
"Initial Catalog=Northwind;Enlist=false;")
Dim cmd As SqlCommand = New SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) " & _
"Values(@CustomerId, @CompanyName)", nwindConn)
cmd.Parameters.Add("@CustomerId", SqlDbType.VarChar, 5).Value = customerId
cmd.Parameters.Add("@CompanyName", SqlDbType.VarChar, 40).Value = companyName
nwindConn.Open()
If Not trans Is Nothing Then
nwindConn.EnlistDistributedTransaction(trans)
End If
Try
cmd.ExecuteNonQuery()
Catch e As SqlException
Throw e
finally
nwindConn.Close()
End Try
End Sub
End Class
</Script>
</html>
[C#]
<%@Page Transaction="Required" %>
<%@Import Namespace="System.Data"%>
<%@Import Namespace="System.Data.SqlClient"%>
<%@Import Namespace="System.EnterpriseServices"%>
<html>
<Script Runat="SERVER" Language="C#">
void Page_Load()
{
NorthwindSample ns = new NorthwindSample();
string customerId = "CUST1";
string companyName = "New Company Name";
try
{
ns.AddCustomer(customerId, companyName, (ITransaction)ContextUtil.Transaction);
ContextUtil.SetComplete();
Response.Write("Customer " + Server.HtmlEncode(customerId) + " added.");
}
catch (Exception e)
{
ContextUtil.SetAbort();
Response.Write("Customer " + Server.HtmlEncode(customerId) + " not added. An exception of type " + e.GetType() + " was encountered.");
}
}
public class NorthwindSample
{
public void AddCustomer(string customerId, string companyName, ITransaction trans)
{
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;" +
"Initial Catalog=Northwind;Enlist=false;");
SqlCommand cmd = new SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) " +
"Values(@CustomerId, @CompanyName)", nwindConn);
cmd.Parameters.Add("@CustomerId", SqlDbType.VarChar, 5).Value = customerId;
cmd.Parameters.Add("@CompanyName", SqlDbType.VarChar, 40).Value = companyName;
nwindConn.Open();
if (trans != null)
nwindConn.EnlistDistributedTransaction(trans);
try
{
cmd.ExecuteNonQuery();
}
catch (SqlException e)
{
throw(e);
}
finally
{
nwindConn.Close();
}
}
}
</Script>
</html>
請參閱
使用 .NET Framework 資料提供者存取資料 | OleDbConnection 類別 | OleDbTransaction 類別 | SqlConnection 類別 | SqlTransaction 類別 | OdbcConnection 類別 | OdbcTransaction 類別