自動交易和 .NET Framework 類別
.NET Framework 類別的執行個體 (Instance) 可以參與自動交易,只要您準備要這樣做的類別。類別的執行個體或物件所存取的每一個資源都在交易中登記。例如,如果物件使用 ADO.NET 傳送金額到資料庫中的帳戶,資料庫的資源管理員將判斷物件是否應該在交易中執行。若是如此,它自動在交易中登記資料庫。
使用下列程序來準備參與自動交易的類別:
將 TransactionAttribute 套用至您的類別。
從 ServicedComponent 類別衍生您的類別。
使用強式名稱簽名組件。
若要使用屬性來對組件簽名,請使用 Sn.exe 建立金鑰組 (Key Pair):
sn -k TestApp.snk
加入 AssemblyKeyFileAttribute 或 AssemblyKeyNameAttribute 組件屬性,指定包含金鑰組的檔案名稱,以便使用強式名稱簽名組件。
<assembly: AssemblyKeyFileAttribute("TestApp.snk")> [C#] [assembly: AssemblyKeyFileAttribute("TestApp.snk")]
如需詳細資訊,請參閱使用強式名稱簽名組件。
以 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
{
//. . .
}
套用交易屬性時,您可以交互使用 Transaction、transaction、TransactionAttribute 和 Transactionattribute。例如,您可以使用 Transaction 或 Transactionattribute 兩者之一產生完全相同的結果。
下列表格列出並描述各個建構函式 (Constructor) 差異。
屬性值 | 說明 |
---|---|
Disabled | 消除物件上自動交易的控制。套用這個屬性值的物件也可以直接利用分散式交易協調器 (DTC) 進行交易支援。
|
NotSupported | 指示物件不在交易範圍內執行。當要求被處理後,不用交易即可建立它的物件內容,不論是否有作用中的交易。
|
Supported | 指示物件在現存的交易內容中執行,若有一個存在。如果交易不存在,物件不用交易即執行。
|
Required
(預設值) |
指示物件需要交易。若有交易存在的話,它會在現存的交易範圍內執行。如果交易不存在,則物件會啟動一個交易。
|
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;
}
}