步骤 2:跨组件扩展事务
目标
在此步骤中,你将了解以下内容:
- 事务流
- 事务中的多个对象投票方式
说明
步骤 1:创建事务组件演示如何编写更新 Microsoft SQL Server Pubs 数据库中的作者信息的简单事务组件。 步骤 2 显示跨多个组件扩展事务时会发生什么情况。
为了配合 COM+ 编程模型, UpdateAuthorAddress
在完成工作的过程中调用另一个组件。 第二个组件ValidateAuthorAddress
验证作者的地址,并将结果返回到其调用方。 UpdateAuthorAddress
与其调用方不同, ValidateAuthorAddress
它不需要事务,但它仍然可以参与其调用方事务。 在此步骤中,其事务属性值设置为 “支持”,如下图所示,它将现有事务扩展到新对象。
仅当调用方是事务时, 支持的 属性值才会扩展 (或流) 现有事务。 调用ValidateAuthorAddress
时UpdateAuthorAddress
,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
摘要
将组件的事务属性设置为 Supported 可能会导致在调用对象的事务中创建新对象。 COM+ 查看调用方上下文以确定新对象的事务状态。 如果调用方是事务性的,COM+ 会将事务流向新对象。
参与同一事务的所有对象共享一个通用事务标识符,COM+ 从对象的上下文中读取该标识符。
事务中的每个对象都独立于其他对象投票。 COM+ 在停用根对象时对投票进行计数。
可以在提交和中止之间切换对象的事务投票,直到 COM+ 停用对象或 COM+ 停用根对象并结束事务为止。 仅最后一次投票设置计数。 IContextState 和 IObjectContext 接口提供方法和生成类似的投票结果,如下表所示。 可以使用任一接口在事务中显式投票。
COM+ 将对象的投票设置为等效的 EnableCommit ,除非组件显式投票。
显式投票可以减少事务的总体持续时间并释放昂贵的资源锁。