目標
在此步驟中,您將瞭解下列各項:
- 交易流程
- 交易中的多個物件投票方式
描述
步驟 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
摘要
將元件的交易屬性設定為 Supported 可能會導致在呼叫物件的異動中建立新的物件。 COM+ 會查看呼叫端的內容,以判斷新物件的交易狀態。 如果呼叫端是交易式,COM+ 會將交易流向新的 物件。
參與相同交易的所有對象都會共用通用交易標識碼,COM+ 會從對象的內容讀取該標識符。
交易中的每個物件都會獨立於其他物件進行投票。 COM+ 會在停用根對象時計算投票數。
您可以在認可和中止之間切換物件的交易投票,直到 COM+ 停用物件,或直到 COM+ 停用根物件並結束交易為止。 只有最後一次投票設定計數。 IContextState 和 IObjectContext 介面提供方法,併產生類似的投票結果,如下表所示。 您可以使用任一介面在交易中明確投票。
IContextState 組合方法 IObjectContext 對等方法 SetMyTransactionVotetxVote = TxCommit
SetDeactivateOnReturnbDeactivate = TrueSetComplete SetMyTransactionVotetxVote = TxCommit
SetDeactivateOnReturnbDeactivate = FalseEnableCommit SetMyTransactionVotetxVote = TxAbort
SetDeactivateOnReturnbDeactivate = TrueSetAbort SetMyTransactionVotetxVote = TxAbort
SetDeactivateOnReturnbDeactivate = FalseDisableCommit 除非元件明確投票,否則 COM+ 會將物件的投票設定為相當於 EnableCommit 的投票。
明確投票可以縮短交易的整體時間,並解除對昂貴資源的鎖定。