共用方式為


步驟 2:延伸交易至多個元件

目標

在此步驟中,您將瞭解下列各項:

  • 交易流程
  • 交易中的多個物件投票方式

描述

步驟 1:建立交易式元件 示範如何撰寫簡單的交易元件,以更新 sql Server Pubs 資料庫中的Microsoft作者資訊。 步驟 2 顯示交易跨多個元件擴充時會發生什麼事。

為了配合 COM+ 程式設計模型,UpdateAuthorAddress 在完成工作過程中呼叫另一個元件。 第二個元件 ValidateAuthorAddress會驗證作者的位址,並將結果傳回給其呼叫端 UpdateAuthorAddress

與其呼叫端不同, ValidateAuthorAddress 不需要交易,但它仍然可以參與其呼叫端的交易。 在此步驟中,其交易屬性值會設定為 Supported,如下圖所示,它會將現有的交易延伸至新的 物件。

顯示將現有交易擴充至新物件的圖表。

只有當呼叫端為交易時,支持的屬性值才會擴充現有的交易(或流程)。 當 UpdateAuthorAddress 呼叫 ValidateAuthorAddress 時,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+ 中管理自動交易