共用方式為


自動交易和 .NET Framework 類別

.NET Framework 類別的執行個體 (Instance) 可以參與自動交易,只要您準備要這樣做的類別。類別的執行個體或物件所存取的每一個資源都在交易中登記。例如,如果物件使用 ADO.NET 傳送金額到資料庫中的帳戶,資料庫的資源管理員將判斷物件是否應該在交易中執行。若是如此,它自動在交易中登記資料庫。

使用下列程序來準備參與自動交易的類別:

  1. TransactionAttribute 套用至您的類別。

  2. ServicedComponent 類別衍生您的類別。

  3. 使用強式名稱簽名組件。

    若要使用屬性來對組件簽名,請使用 Sn.exe 建立金鑰組 (Key Pair):

    sn -k TestApp.snk
    

    加入 AssemblyKeyFileAttributeAssemblyKeyNameAttribute 組件屬性,指定包含金鑰組的檔案名稱,以便使用強式名稱簽名組件。

    <assembly: AssemblyKeyFileAttribute("TestApp.snk")>
    [C#]
    [assembly: AssemblyKeyFileAttribute("TestApp.snk")]
    

    如需詳細資訊,請參閱使用強式名稱簽名組件

  4. 以 COM+ 資料庫目錄 (Catalog) 註冊包含您類別的組件 (Assembly)。

    如果呼叫您類別執行個體的用戶端受 Common Language Runtime 管理,則為您執行註冊。然而,若您希望 Unmanaged 呼叫端能夠建立並呼叫您類別的執行個體,請使用 .NET 服務安裝工具 (Regsvcs.exe) 來手動執行註冊。

下列範例示範如何將 TransactionAttribute 屬性套用到衍生自 ServicedComponent 類別的類別。

<Transaction(TransactionOption.Required)> Public Class SampleClass
   Inherits ServicedComponent
   '. . .
End Class
[C#]
[Transaction(TransactionOption.Required)]
public class SampleClass(): ServicedComponent
{
  //. . .
}

套用交易屬性時,您可以交互使用 TransactiontransactionTransactionAttributeTransactionattribute。例如,您可以使用 TransactionTransactionattribute 兩者之一產生完全相同的結果。

下列表格列出並描述各個建構函式 (Constructor) 差異。

屬性值 說明
Disabled 消除物件上自動交易的控制。套用這個屬性值的物件也可以直接利用分散式交易協調器 (DTC) 進行交易支援。
[Transaction(TransactionOption.Disabled)]
NotSupported 指示物件不在交易範圍內執行。當要求被處理後,不用交易即可建立它的物件內容,不論是否有作用中的交易。
[Transaction(TransactionOption.NotSupported)]
Supported 指示物件在現存的交易內容中執行,若有一個存在。如果交易不存在,物件不用交易即執行。
[Transaction(TransactionOption.Supported)]
Required

(預設值)

指示物件需要交易。若有交易存在的話,它會在現存的交易範圍內執行。如果交易不存在,則物件會啟動一個交易。
[Transaction(TransactionOption.Required)]
RequiresNew 指示物件需要交易,並為每一個要求啟動新交易。
[Transaction(TransactionOption.RequiresNew)]

範例類別

下列程式碼範例示範數個自動交易的項目。這個範例中,交易類別和呼叫類別的用戶端都受 Runtime 管理。

' -----------------------------------------------------------------
' TestApp.vb
' Generate a Strong name: 
'    sn -k TestApp.snk
' Compile the code:
'    vbc /target:exe /r:System.EnterpriseServices.dll TestApp.vb
' Run TestApp:
'    start TestApp.exe
' -----------------------------------------------------------------
Option Explicit
Option Strict

Imports System
Imports System.Runtime.CompilerServices
Imports System.EnterpriseServices
Imports System.Reflection

'Registration details.
'COM+ application name as it appears in the COM+ catalog.
<assembly: ApplicationName("TestApp")>
'Strong name for assembly.
<assembly: AssemblyKeyFileAttribute("TestApp.snk")>

<Transaction(TransactionOption.Required)> Public Class Account
   Inherits ServicedComponent
   
   'Provides SetComplete behavior in the absence of exceptions.
   <AutoComplete()> Public Sub Debit(amount As Integer)
      ' Do some database work. Any exception thrown here aborts the 
      ' transaction; otherwise, transaction commits.
   End Sub
End Class

Public Class client
   Public Shared Sub Main()
      Dim accountX As New Account()
      accountX.Debit(100)
      Environment.Exit(0)
   End Sub
End Class
[C#]
// -----------------------------------------------------------------
// TestApp.cs
// Generate a Strong name: 
//    sn -k TestApp.snk
// Compile the code:
//    csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs
// Run TestApp:
//    start TestApp.exe
// -----------------------------------------------------------------
using System;
using System.Runtime.CompilerServices;
using System.EnterpriseServices;
using System.Reflection;

//Registration details.
//COM+ application name as it appears in the COM+ catalog.
[assembly: ApplicationName("TestApp")]
//Strong name for assembly.
[assembly: AssemblyKeyFileAttribute("TestApp.snk")]

[Transaction(TransactionOption.Required)]
public class Account : ServicedComponent
{
  //Provides SetComplete behavior in the absence of exceptions.
  [AutoComplete]
  public void Debit(int amount)
  {
     // Do some database work. Any exception thrown here aborts the 
     // transaction; otherwise, transaction commits.
  }
}

public class client
{
  public static int Main() 
  {
    Account accountX = new Account();
    accountX.Debit(100);
    return 0;
  }
}

請參閱

自動交易在自動交易中表決 | 撰寫服務元件