Freigeben über


Automatische Transaktionen und .NET Framework-Klassen

Instanzen einer .NET Framework-Klasse können an einer automatischen Transaktion beteiligt sein, sofern Sie die nötigen vorbereitenden Schritte für die Klasse durchführen. Jede Ressource, auf die durch eine Klasseninstanz oder ein Objekt zugegriffen wird, trägt sich in der Transaktion ein. Wenn beispielsweise ein Objekt ADO.NET verwendet, um einen Geldbetrag auf einem Konto in einer Datenbank zu verbuchen, ermittelt der Ressourcen-Manager der Datenbank, ob das Objekt innerhalb einer Transaktion ausgeführt werden muss. In diesem Fall trägt der Manager die Datenbank automatisch in der Transaktion ein.

Verwenden Sie die folgende Vorgehensweise, um eine Klasse auf die Teilnahme an einer automatischen Transaktion vorzubereiten:

  1. Weisen Sie der Klasse das TransactionAttribute zu.

  2. Leiten Sie die Klasse von der ServicedComponent-Klasse ab.

  3. Signieren Sie die Assembly mit einem starkem Namen.

    Um die Assembly mittels Attributen zu signieren, müssen Sie unter Verwendung von Sn.exe ein Schlüsselpaar erstellen:

    sn -k TestApp.snk
    

    Fügen Sie das AssemblyKeyFileAttribute- oder AssemblyKeyNameAttribute-Assemblyattribut hinzu, das den Namen der Datei angibt, die das Schlüsselpaar enthält, um die Assembly mit einem starken Namen zu signieren.

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

    Weitere Informationen dazu finden Sie unter Signieren einer Assembly mit einem starken Namen.

  4. Registrieren Sie die Assembly mit der Klasse im COM+-Katalog.

    Wenn der Client, der Instanzen der Klasse aufruft, von der Common Language Runtime verwaltet wird, erfolgt die Registrierung automatisch. Wenn jedoch zu erwarten ist, dass ein nicht verwalteter Aufrufer Instanzen der Klasse erstellen und aufrufen wird, verwenden Sie das .NET Services Installation-Tool (Regsvcs.exe), um die Registrierung manuell durchzuführen.

Das folgende Beispiel veranschaulicht, wie das TransactionAttribute-Attribut einer Klasse zugewiesen wird, die von der ServicedComponent-Klasse abgeleitet wurde.

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

Beim Zuweisen des Transaktionsattributs können Sie gleichermaßen Transaction, transaction, TransactionAttribute oder transactionattribute verwenden. Beispielsweise führen sowohl Transaction als auch transactionattribute zu identischen Ergebnissen.

In der folgenden Tabelle werden alle Konstruktorvarianten aufgeführt und beschrieben.

Attributwert Beschreibung
Disabled Deaktiviert die Steuerung automatischer Transaktionen für das Objekt. Ein Objekt mit diesem Attributwert kann DTC (Distributed Transaction Coordinator) direkt zur Transaktionsunterstützung auffordern.
[Transaction(TransactionOption.Disabled)]
NotSupported Gibt an, dass das Objekt nicht innerhalb des Gültigkeitsbereichs von Transaktionen ausgeführt wird. Beim Verarbeiten einer Anforderung wird der Objektkontext ohne eine Transaktion erstellt, unabhängig davon, ob eine Transaktion aktiv ist.
[Transaction(TransactionOption.NotSupported)]
Supported Gibt an, dass das Objekt im Kontext einer ggf. vorhandenen Transaktion ausgeführt wird. Wenn keine Transaktion vorhanden ist, wird das Objekt ohne eine Transaktion ausgeführt.
[Transaction(TransactionOption.Supported)]
Required

(Standard)

Gibt an, dass das Objekt eine Transaktion erfordert. Es wird im Gültigkeitsbereich einer ggf. vorhandenen Transaktion ausgeführt. Wenn keine Transaktion vorhanden ist, wird durch das Objekt eine Transaktion begonnen.
[Transaction(TransactionOption.Required)]
RequiresNew Gibt an, dass das Objekt eine Transaktion erfordert und für jede Anforderung eine neue Transaktion begonnen wird.
[Transaction(TransactionOption.RequiresNew)]

Beispielklasse

Der folgende Code veranschaulicht verschiedene Elemente einer automatischen Transaktion. In diesem Beispiel werden die Transaktionsklasse und der Client, der die Klasse aufruft, von der Laufzeit verwaltet.

' -----------------------------------------------------------------
' 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;
  }
}

Siehe auch

Automatische Transaktionen | Abstimmung in einer Automatischen Transaktion | Schreiben von Serviced Components