Compartir a través de


Transacciones manuales

La característica de transacciones manuales de COM+ permite que los componentes COM+ establezcan una transacción de DTC (Coordinador de transacciones distribuidas de Microsoft) o un protocolo Internet de transacciones (TIP) existentes como la propiedad de transacción del contexto de un componente nuevo. Así, los componentes COM+ se pueden asociar a transacciones cuya duración está controlada por un monitor de procesamiento de transacciones, un servicio de transacciones de objetos o un sistema de administración de bases de datos. La característica de transacciones manuales también resulta útil para la integración con transacciones coordinadas por TIP.

Nota   Las transacciones automáticas, en lugar de las manuales, son el modelo de programación preferible para escribir componentes empresariales. Las transacciones manuales se deben utilizar con cuidado. En ciertas situaciones, pueden hacer que una transacción abarque varios dominios de sincronización (es decir, que permitan que exista el paralelismo con una transacción).

La clase BYOT expone dos métodos: CreateWithTransaction y CreateWithTipTransaction. En el ejemplo siguiente se muestra cómo se crea un objeto que utilice la transacción de otro objeto.

Ejemplo de transacción manual (BYOT)

Imports System
Imports System.Reflection
Imports System.EnterpriseServices

<assembly: AssemblyKeyFile("BYOTDemo.snk")>

Public Class Base 
      Inherits ServicedComponent
      Public Readonly Property Transaction() as Object
        Get
            Return ContextUtil.Transaction
        End Get
      End Property
End Class

<Transaction()> Public Class CTransaction1 
Inherits Base
' Insert your transaction logic here.
End Class

<Transaction()> Public Class CTransaction2 
Inherits Base
' Insert your transaction logic here.
End Class

Class BYOTDemonstration
      Public Shared Sub Main()
            ' Create a transactional object, and then get its
            ' transaction.
            Dim tx1 as New CTransaction1
            Console.WriteLine("Created transaction1.")
            Dim tx as Object = tx1.Transaction
            Console.WriteLine("Got the transaction of transaction1.")       
            Dim tx2 as CTransaction2 = ctype(BYOT.CreateWithTransaction(tx, _ gettype(CTransaction2)),CTransaction2)
            Console.WriteLine("Created transaction2 with the _
            transaction of transaction1.")
            End Sub
End Class
[C#]
using System;
using System.Reflection;
using System.EnterpriseServices;

[assembly: AssemblyKeyFileAttribute("byotdemo.snk")]

public class Base : ServicedComponent
{
    public Object Transaction 
    { 
        get { return ContextUtil.Transaction; } 
    }    
}

[Transaction]
public class CTransaction1 : Base 
{
      // Insert your transaction logic here.
}

[Transaction]
public class CTransaction2 : Base 
{
      // Insert your transaction logic here.
}

class BYOTDemonstration
{
      static void Main()
      {
            /* Create a transactional object, and then get its
                  transaction. */
              CTransaction1 tx1 = new CTransaction1();
            Console.WriteLine("Created transaction1.");
              Object tx = tx1.Transaction;
            Console.WriteLine("Got the transaction of transaction1.");        
              CTransaction2 tx2 = (CTransaction2)BYOT.CreateWithTransaction(tx, typeof(CTransaction2));
            Console.WriteLine("Created transaction2 using the transaction of transaction1.");
      }
}

Makefile.bat

El ejemplo se puede compilar así:

sn –k BYOTDemo.snk
vbc /r:System.EnterpriseServices.dll BYOTDemo.vb
[C#]
sn –k BYOTDemo.snk
csc BYOTDemo.cs

Vea también

Resumen de servicios COM+ disponibles | System.EnterpriseServices (Espacio de nombres)