Cómo usar transacciones automáticas en una clase de .NET Framework

En el procedimiento siguiente se describe cómo preparar una clase para que participe en una transacción automática.

Para preparar una clase para que participe en una transacción automática

  1. Derive su clase de la clase ServicedComponent y aplique el atributo TransactionAttribute a su clase. En el ejemplo siguiente se muestra cómo aplicar el atributo TransactionAttribute a una clase derivada de la clase ServicedComponent.

    <Transaction(TransactionOption.Required)> Public Class Account
       Inherits ServicedComponent
       '. . .
    End Class
    
    [Transaction(TransactionOption.Required)]
    public class Account : ServicedComponent
    {
      //. . .
    }
    
  2. Aplique el atributo AutoComplete a cada método para el que se deba llamar automáticamente al método ContextUtil.SetComplete en ausencia de excepciones. En el siguiente ejemplo se muestra cómo se aplica el atributo AutoComplete.

    <AutoComplete()> Public Sub Debit(amount As Integer)
          ' Do some database work. Any exception thrown here aborts the 
          ' transaction; otherwise, transaction commits.
    End Sub
    
    [AutoComplete]
    public void Debit(int amount)
    {
        // Do some database work. Any exception thrown here aborts the 
        // transaction; otherwise, transaction commits.
    }
    
  3. Firmar un ensamblado con un nombre seguro. Para firmar el ensamblado con atributos, cree un par de claves mediante Sn.exe, agregue el atributo de ensamblado AssemblyKeyFileAttribute o AssemblyKeyNameAttribute y especifique el nombre del archivo que contiene el par de claves para firmar el ensamblado con un nombre seguro.

    <assembly: AssemblyKeyFileAttribute("TestApp.snk")>
    
    [assembly: AssemblyKeyFileAttribute("TestApp.snk")]
    
  4. Registre el ensamblado que contiene la clase con el catálogo de COM+.

  5. Si Common Language Runtime administra el cliente que llama a instancias de la clase, el registro se realiza automáticamente. Sin embargo, si se prevé que un llamador no administrado pueda crear y llamar a instancias de la clase, se debe utilizar la herramienta Instalación de servicios de .NET (Regsvcs.exe) para realizar el registro manualmente.

Ejemplo

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

Consulte también

Conceptos

Votación en una transacción automática

Otros recursos

Escribir componentes con servicio

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.