Share via


Bring Your Own Transaction (BYOT)

La funzionalità BYOT di COM+ consente ai componenti COM+ di impostare una transazione DTC (Microsoft Distributed Transaction Coordinator) o TIP (Transaction Internet Protocol) preesistente come proprietà di transazione del contesto di un nuovo componente. In questo modo è possibile associare i componenti COM+ a transazioni le cui durate vengono controllate mediante un monitor di elaborazione delle transazioni, un servizio di transazioni di oggetti o un sistema di gestione di database. La funzionalità BYOT risulta inoltre utile per l'integrazione con le transazioni coordinate da TIP.

Nota   Le transazioni automatiche costituiscono il modello di programmazione migliore per la scrittura dei componenti business, rispetto alle transazioni BYOT. Si consiglia di utilizzare queste ultime con cautela, poiché possono verificarsi casi in cui una transazione condivida più domini di sincronizzazione, ovvero casi di parallelismo con una transazione.

Con la classe BYOT vengono esposti due metodi: CreateWithTransaction e CreateWithTipTransaction. Nell'esempio seguente viene illustrato come creare un oggetto in cui viene utilizzata la transazione da un altro oggetto:

Dimostrazione di 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

È possibile compilare l'esempio nel modo illustrato di seguito.

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

Vedere anche

Riepilogo dei servizi COM+ disponibili | Spazio dei nomi System.EnterpriseServices