在事务中使用非事务组件

将非事务组件置于事务中以利用事务的 ACID 属性通常很有用。 例如,如果有用于更新网络上密码的非事务旧组件,则可以将这些组件放置在事务中,以确保密码更新在整个网络中保持一致。

事务上下文对象是一个通用对象,允许非事务客户端将多个 COM 对象的工作合并到单个事务中,而无需专门为此开发新组件。 与自动事务相反,事务上下文对象要求其客户端显式提交或中止事务。

默认情况下,将事务上下文对象的事务属性值设置为 Required。 如果客户端释放事务上下文对象,而不显式发出提交或中止调用,则 COM+ 将中止事务。

以下 Visual Basic 示例演示非事务客户端如何将多个对象完成的工作组合到单个事务中:

Dim objTxCtx As TransactionContext
Dim objCat As MyDLL.Ccat  ' Ccat is a user-defined component.
Dim objDog As MyDLL.Cdog  ' Cdog is a user-defined component.

' Get TransactionContext object.
Set objTxCtx = _
  CreateObject ("TxCtx.TransactionContext")

' Create instances of Cat and Dog.
Set objCat = _ 
  objTxCtx.CreateInstance ("MyDLL.Ccat")
Set objDog = _ 
  objTxCtx.CreateInstance ("MyDLL.Cdog")

' Both objects do work.
objDog.Bark
objCat.Hiss

' Commit the transaction.
objTxCtx.Commit

事务上下文对象的限制

以下是事务上下文对象的一些重要限制:

  • 使用事务上下文对象时,将多个对象的工作合并到单个事务的应用程序逻辑将绑定到特定的非事务客户端实现,并且会丧失使用 COM 组件的一些优势。 这些丧失的优势包括:

    • 能够作为更大事务的一部分重用应用程序逻辑
    • 强制实施声明性安全性
    • 灵活从客户端远程运行逻辑
  • 事务上下文对象使用非事务客户端在进程内运行,这意味着 COM+ 必须在非事务客户端计算机上可用。 例如,当从与 COM+ 在同一服务器上运行的 Active Server Pages (ASP) 页中使用事务上下文对象时,这可能不是问题。

  • 创建事务上下文对象时,不会获取非事务客户端的上下文。 只能通过使用事务上下文对象创建的 COM 对象间接完成事务工作。 具体而言,非事务客户端不能使用 COM+ 资源分配器(如 ODBC),并且该事务中包含工作。 例如,开发人员可能熟悉在关系数据库系统上执行事务工作的以下语法:

    BEGIN TRANSACTION
      DoWork
    COMMIT TRANSACTION
    

    以类似的方式使用事务上下文对象不会产生所需的结果:

    Set objTxCtx = CreateObject ("TxCtx.TransactionContext")
      DoWork
      objTxCtx.Commit
    Set objTxCtx = Nothing
    

    不会在事务中登记此示例中的 DoWork 调用。 相反,必须生成调用 DoWork 的 COM 组件,使用事务上下文对象创建该组件的对象实例,然后从非事务客户端调用该对象,使该工作成为客户端控制的事务的一部分。