共用方式為


在分散式交易中登記

如果 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 類別