萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> COM+事務和IIS

COM+事務和IIS

class="area"> microsoft已經緊密地集成了iis和com+的功能,這使我們能非常容易地在事務性web頁面編程中利用事務處理應用程序。有許多不同方式集成com+和iis的事務特性,這些例子包括:
? 事務性asp。
? asp 中的objectcontext。
? 事務性事件。
開發者可以在使用iis和com+的應用程序中使用一個或多個這些特性。因為它們是緊密集成的,開發者只進行少量的工作,就能充分利用這些服務。事實上,在com+ 中objectcontext封裝了一個事務,可以直接用於事務中的asp頁面。
19.4.1 事務性asp
由於iis 4.0和mts的集成,開發者可以在一個事務中包含asp腳本。這些asp網頁可以包含對服務器組件的調用,這些組件也將參與相同的事務。同所有的事務一樣,如果事務的任一部分失敗,將回滾整個事務。事務性asp腳本所增加的優點就是使得把多個組件綁定到單個事務中變得簡單化。
當處理一個終止的事務時,使用事務性腳本有一個問題。通過數據庫的資源管理器訪問數據庫產生的改變將被自動地回滾,然而, com+不能回滾腳本自身產生的變化。例如,使用腳本產生的任何變化,如對session或application變量的改變,將不會自動地回滾。以後你將看到如何使用事務性事件通知事務已經終止。當處理這個事件時,能手工地回滾com+不能自動回滾的變化。這種限制的原因是com+事務只能回滾與ms dtc相容的服務產生的變化。
在iis 5.0中有一個新特性。開發者具有使得一個事務跨越多個asp腳本網頁的能力。這歸功於在server對象上新增的execute和transfer方法。
然而,正常情況下,單個事務的所有處理可以在單個asp網頁中完成。例如,如果一個應用程序有一個組件從一個帳戶中提款,而另一個組件在一個帳戶中存款。為了把資金從一個帳戶轉到另一個帳戶,創建asp腳本,利用提款組件從帳戶中取出資金,使用存款組件把資金存入新的帳戶。將所有這些功能放入一個事務性asp網頁中,如果事務過程的任一部分失敗,就回滾所有的變化,帳戶余額回到其初始值。
為聲明一個網頁是事務性的,使用下列指令:
<%@ transaction=value %>
對transaction指令可能的設置有:
? disabled:告訴com+不希望在事務中涉及組件。
? requires_new:即使已存在一個事務,也啟動一個新的事務。
? required:如果不存在事務就啟動一個新的,如果存在就參與到其中。
? supported:不啟動一個事務,但是如果事務已經存在就參與它。
? not_supported:即使存在事務,也不參與事務。
這些值與使用組件服務浏覽器為每個組件設置的transaction support屬性的作用相同。
transaction指令必須處在asp頁面腳本的第一行,通常由language指令包含。如果這之前在頁面中有任何內容,將產生腳本錯誤。如同組件中的事務一樣,如果到達代碼的最後一行,還沒有提交或終止,則com+假定提交,並把變化寫入磁盤。另外,由頁面調用的每個對象能夠使用同一asp頁面的objectcontext對象參與事務,通常就是這麼做的。
19.4.2 事務性asp中的objectcontext對象
當編寫一個事務性asp腳本時,你可能想直接影響腳本的事務的結果。像為事務編寫的組件一樣,asp頁也能利用objectcontext對象。自從發表了asp 2.0以後,就可以利用這個對象,它為開發者需要的所有事務處理例程提供功能。服務器組件參與事務時訪問的就是這個對象,它包含setabort和setcomplete方法。
下列代碼顯示了在一個事務性web頁中如何實例化兩個com對象和一個事務,並在這兩個對象上調用一個方法。
注意,頁面頂部的事務設置表明請求一個事務。正是該設置使該頁面像com組件一樣參與同一事務。事實上,只要com組件的transaction support屬性為required或supported,它們就變成由asp頁啟動的事務的一部分。

<%@ LANGUAGE=VBScript TRANSACTION=Required%>

<%

Dim objA
Dim objB

Set objA = Server.CreateObject("MyDll.MyClass")
Set objB = Server.CreateObject("MyDll2.MyClass2")

If Not objA.Go = 0 Then
 ObjectContext.SetAbort
ElseIf Not objB.Go = 0 Then
 ObjectContext.SetAbort
Else
 ObjectContext.SetComplete
End If
Set objA = Nothing
Set objB = Nothing

%>



隨著asp頁執行,調用每個com類的一個方法。當執行每個方法時,其返回值用於決定處理是否成功。如果任一方法返回一個非零值, asp頁務。否則, asp頁將提交事務並將變化存入磁盤。
這個例子的要點是所有的方法調用隨著asp頁面一調用objectcontext對象中的setabort方法,回滾事起進入到同一事務中。
上述的例子還可以改寫,使得com組件中的方法從內部調用setcomplete和setabort方法。這將從asp頁中刪除一些邏輯,並嵌入到com組件中。用這種方式編寫事務的唯一問題是asp頁不知道將要提交還是終止事務。然而,這可以通過實現事務事件來解決。
19.4.3 事務事件
asp頁也具有偵聽com+的能力,可以了解事務何時將提交或終止。這是通過在com+提交或終止事務前iis調用兩個例程來實現的。這兩個方法稱為o transaction commit和on transactionabort。
ontransactioncommit方法在com+提交事務之前、准備階段之後被觸發。只要事務中沒有任何部分終止,將觸發ontransactioncommit例程(事件),提交事務。如果事務被終止,則觸發ontransactionabort事件:

<%@ LANGUAGE=VBScript TRANSACTION=Required%>

<%

Dim objA

Set objA = Server.CreateObject("MyDll.MyClass")
objA.Go
Set objA = Nothing

' Fires if the transaction commits
Sub OnTransactionCommit
 Response.Write ""
 Response.Write "The Transaction committed."
 Response.Write ""
End Sub

' Fires if the transaction aborts
Sub OnTransactionAbort
 Response.Write ""
 Response.Write "The Transaction aborted."
 Response.Write ""
End Sub
%>


同大多數事務性asp頁一樣,上述例子的開始外聲明它要求一個事務,接下來腳本調用一個事務性com對象的方法。一旦完成該頁, com+將通過檢查是否有事務的某一部分調用了setabort方法來決定事務的結果。如果沒有調用setabort方法,就觸發ontransactioncommit事件,並且提交該事務;如果調用了setabort方法,則觸發ontransactionabort事件,回滾事務。

copyright © 萬盛學電腦網 all rights reserved