BYOT (Bring Your Own Transaction)

COM+ の BYOT 機能を使用すると、既存の Microsoft 分散トランザクション コーディネータ (DTC: Distributed Transacton Coordinator) トランザクションまたはトランザクション インターネット プロトコル (TIP: Transaction Internet Protocol) トランザクションを、新しいコンポーネントのコンテキストのトランザクション プロパティとして設定できます。これにより、COM+ コンポーネントを、トランザクション処理モニタ、オブジェクト トランザクション サービス、またはデータベース管理システムによって有効期間が制御されるトランザクションに関連付けることができます。BYOT は、TIP によって調整されるトランザクションを統合する場合にも便利です。

メモ   ビジネス コンポーネントを記述するのに適したプログラミング モデルは、BYOT トランザクションではなく、自動トランザクションです。BYOT トランザクションを使用するには注意が必要です。条件によっては、BYOT トランザクションが複数の同期ドメインにまたがる (つまり、トランザクションとの平行処理ができる) 場合があります。

BYOT クラスは、CreateWithTransactionCreateWithTipTransaction の 2 つのメソッドを公開します。他のオブジェクトからの BYOT トランザクションを使用するオブジェクトを作成する方法を次の例で示します。

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

この例を次のようにコンパイルできます。

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

参照

利用可能な COM+ サービスの概要 | System.EnterpriseServices