步骤 2:跨组件扩展事务

目标

在此步骤中,你将了解以下内容:

  • 事务流
  • 事务中的多个对象投票方式

说明

步骤 1:创建事务组件演示如何编写更新 Microsoft SQL Server Pubs 数据库中的作者信息的简单事务组件。 步骤 2 显示跨多个组件扩展事务时会发生什么情况。

为了配合 COM+ 编程模型, UpdateAuthorAddress 在完成工作的过程中调用另一个组件。 第二个组件ValidateAuthorAddress验证作者的地址,并将结果返回到其调用方。 UpdateAuthorAddress

与其调用方不同, ValidateAuthorAddress 它不需要事务,但它仍然可以参与其调用方事务。 在此步骤中,其事务属性值设置为 “支持”,如下图所示,它将现有事务扩展到新对象。

Diagram that shows the extending the existing transaction to the new object.

仅当调用方是事务时, 支持的 属性值才会扩展 (或流) 现有事务。 调用ValidateAuthorAddressUpdateAuthorAddress,COM+ 首先查看调用方上下文以查看其是否是事务性的。 然后,COM+ 查看设置 ValidateAuthorAddress 的服务属性,并将新对象分配给调用方对象的同一事务标识符。 若要更好地了解此过程,请参阅 上下文激活

由于它们共享相同的事务标识符,因此两个对象必须成功完成其工作,或者 COM+ 中止事务 (撤消对 Pubs 数据库所做的任何更改) 。

参与事务投票的所有对象都提交或中止事务。 在代码中包含投票指令时,显式进行投票,如以下从步骤 1 示例代码提取中所示,这会创建 UpdateAuthorAddress 组件:

  ' Everything works.
  contextstate.SetMyTransactionVote TxCommit
  contextstate.SetDeactivateOnReturn True
  Exit Sub
  
UnexpectedError:
  ' There's an error.
  contextstate.SetMyTransactionVote TxAbort
  contextstate.SetDeactivateOnReturn True

投票也隐式发生,如组件 ValidateAuthorAddress 中所示。 除非该对象另有声明,否则 COM+ 假定对象已成功完成其工作,但尚未准备好停用。 COM+ 做出以下假设:

  contextstate.SetMyTransactionVote TxCommit
  contextstate.SetDeactivateOnReturn False

返回其调用方时 ValidateAuthorAddress ,COM+ 将投票读作提交。 COM+ 不会在停用根对象(在本例 UpdateAuthorAddress 中为对象)中第一个对象之前对投票进行计数。

代码示例

ValidateAuthorAddress 组件对作者的地址进行了简单的检查。 由于 UpdateAuthorAddress 未显式投票,COM+ 使用默认投票设置。

Option Explicit
'
'   Purpose:   This class is used for validating an author's address
'              (presumably right before updating that address in the
'              database).
'
'   Notes:   This component could be in a transaction or not; it doesn't 
'            matter because it doesn't touch any data in a database.
'
Public Function ValidateAuthorAddress( _
                        ByVal strAddress As String, _
                        ByVal strCity As String, _
                        ByVal strState As String, _
                        ByVal strZip As String) As Boolean
  ' Default is to validate unless something is found to be wrong.
  ValidateAuthorAddress = True
                                                  
  '  Invalidate authors who live in New York City
  '  and authors who live in Montana.
  '
  If strCity = "New York" And strState = "New York" Then
    ValidateAuthorAddress = False
  ElseIf strState = "Montana" Then
    ValidateAuthorAddress = False
  End If
  ' Done
End Function

摘要

步骤 1:创建事务组件

步骤 3:重用组件

上下文激活

在 COM+ 中管理自动事务