ASP系列講座(二十一)建立事務性腳本
作者:Eve Cole
更新時間:2009-05-30 19:58:32
商業應用程式常常需要具有在事務內部運行腳本和元件的能力。事務是一種伺服器操作,即使該操作包含許多步驟(例如,定貨、查看存貨、付帳等),也只能整體返回操作是成功還是失敗。使用者可以建立在事務內部執行的ASP 腳本,如果腳本的任何一部分失敗,整個事務都會終止。
ASP 交易處理是以Microsoft® Transaction Server (MTS) 為基礎的。 Microsoft® Transaction Server (MTS) 是一個事務處理系統,用於開發、配置和管理高效能、可分級的、具有穩健性的企業Internet 和Intranet 伺服器應用程式。 Transaction Server 為開發分散式的,基於元件的應用程式提供了一個應用程式設計模型。它也為配置和管理這些應用程式提供了一個運行環境。
建立事務性腳本的功能內建在Internet Information Server 和Personal Web Server 中。如果您安裝了Microsoft Transaction Server,您就可以將元件打包,讓元件在交易內部運作。
關於事務事務是整體成功或失敗的操作。事務處理用於對資料庫進行可靠地更新。在對資料庫進行許多相關變更或同時更新多個資料庫時,請確保所有變更都正確執行。如果這些變更中的任何一個失敗,都需要還原資料庫表的原始狀態。
如果沒有MTS,您就需要編寫腳本和元件,手動追蹤請求的變更情況,以便在某些變更失敗時復原資料。使用MTS,您只需簡單的將您的腳本和元件聲明為「需要事務」並讓MTS 處理事務的一致性。事務處理只適用於資料庫存取;MTS 不能對檔案系統或其他的非事務性資源的變更進行復原作業。應用程式所存取的資料庫必須為MTS 所支援。目前,MTS 支援SQL Server 及任何支援XA 協定(由X/Open 協會制定)的伺服器。 MTS 將繼續擴展對其他資料庫的支援。
事務不能跨越多個ASP 頁。如果一個事務需要來自多個元件的對象,則須將使用這些對象的操作組合在一個ASP 頁中。例如,假定有一個元件用於更新薪資資料庫,還有一個元件用於更新人力資源資料庫中的員工記錄。為了記錄一個員工的新的工資信息,您需要編寫這樣一個腳本,該腳本在一個事務環境中調用這兩個組件,一個用於更新工資單數據庫,另一個用於更新人力資源數據庫中的員工等級。
聲明事務性腳本在將一個頁聲明為事務性時,此頁中的任何腳本命令和物件都運行在同一個事務環境中。 Transaction Server 處理產生交易的細節並決定交易成功(提交)或失敗(終止)。若要將某頁宣告為事務性,可在頁首新增@TRANSACTION 指令:
<%@ TRANSACTION = value %>
value 參數可以是下列之一:
值意義
Requires_New 啟動一個新的交易。
Required 啟動一個新的事務。
Supported 不啟動事務。
Not_Supported 不啟動事務。
@TRANSACTION 指令必須在一頁中的第一行,否則將產生錯誤。必須將該指令加入到需要在事務下運行的每一頁。當腳本處理結束時,目前事務即告結束。
大多數應用程式只有一些特定的操作需要事務環境。例如,航空公司的站點可能只需要事務性腳本處理購票和安排座位,而其他所有腳本則無須事務環境即可安全運作。因為事務只須用於需要事務處理的頁即可,不要將應用程式的Global.asa 檔案聲明為事務性。
如果交易被終止,Transaction Server 將恢復對支援事務的資源的任何變更。目前,僅資料庫伺服器完全支援事務,因為資料庫中的資料對於企業應用是最關鍵的。 Transaction Server 不會對硬碟上的檔案、會話和應用程式的變數、集合等的變更進行還原。然而您可以如下文主題所述,透過編寫交易事件來編寫恢復變數和集合的腳本。在某些時候,您的腳本也可以明確的提交或終止一個事務,例如寫入資料到文件失敗時。
提交或終止腳本因為Transaction Server 追蹤事務處理,所以它決定交易是完全成功還是失敗。腳本可以透過呼叫ObjectContext.SetAbort 來明確地宣告終止一個交易。 例如,當一個事務在從一個元件收到錯誤訊息、違反商業規範時(例如,帳戶餘額小於 0)或讀寫檔案等非事務性操作失敗時,腳本就需要終止該交易。如果頁在事務完成之前逾時,也必須終止事務。
編寫事務事件腳本本身不能決定事務是成功還是失敗。但是,可以編寫提交或終止交易時被呼叫的事件。例如,假設有一個確認銀行帳戶的腳本,並且您需要針對交易的不同狀態將不同的頁面傳回給用戶,那麼就可以使用OnTransactionCommit 和OnTransactionAbort 事件來編寫對用戶的不同回應。
<%@ TRANSACTION = Required %>
<%
'Buffer output so that different pages can be displayed.
Response.Buffer = True
%>
<HTML>
<BODY>
<H1>Welcome to the online banking service</H1>
<%
Set BankAction = Server.CreateObject("MyExample.BankComponent")
BankAction.Deposit(Request("AcctNum"))
%>
<P>Thank you. Your transaction is being processed.</P>
</BODY>
</HTML>
<%
' Display this page if the transaction succeeds.
Sub OnTransactionCommit()
Response.Write "<HTML>"
Response.Write "<BODY>"
Response.Write "Thank you. Your account has been credited."
Response.Write "</BODY>"
Response.Write "</HTML>"
Response.Flush()
end sub
%>
<%
' Display this page if the transaction fails.
Sub OnTransactionAbort()
Response.Clear()
Response.Write "<HTML>"
Response.Write "<BODY>"
Response.Write "We are unable to complete your transaction."
Response.Write "</BODY>"
Response.Write "</HTML>"
Response.Flush()
End sub
%>
在MTS 資源管理器中登記一個元件為了參與一個事務,元件必須在MTS 套件中登記,而且必須被設定為需要事務。例如,如果您的腳本是透過呼叫兩個元件來處理訂單的,一個更新庫存資料庫,另一個更新付款資料庫。那麼,這兩個元件就要在同一個事務環境中運作。 Transaction Server 保證如果任一個元件失敗,那麼將不會有資料庫被更新。某些組件不需要事務;例如,Ad Rotator 組件。
註冊和設定事務性元件可使用MTS 資源管理器。必須將事務的屬性設定為需要事務或需要新事務。事務組件必須在MTS 包中註冊。不要將組件放在IIS 內部進程包中,而應該創建自己的包。通常,應將所有的元件放在一個元件庫中。元件庫的元件可被多個ASP 應用程式使用並以ASP 應用程式進程運作。使用MTS 資源管理器可建立新的套件並將套件的Activation 屬性設定為Library。
也可以在Server 套件中註冊事務性元件。 Server 套件通常以伺服器上的一個獨立的進程執行。如果希望使用基於職能群組的安全性檢查或希望您的元件可被遠端電腦上的應用程式訪問,可對事務性元件使用Server 套件。
若要使用MTS 資源管理器,必須安裝Microsoft Transaction Server。
物件作用域一般情況下,不要將從MTS 元件中建立的物件儲存在ASP Application 或Session 物件中。 MTS 物件在交易完成後消失。因為Session 物件和Application 物件是為在不同ASP 頁之間使用的物件實例設計的,所以不要用它們保存在交易結束時即被釋放的物件。
ASP 腳本是已聲名的交易的根,即起始點。任何事務性ASP 頁所使用的MTS 物件都被視為事務的一部分。當事務完成後,在頁中使用的MTS 物件將消失,其中包括儲存在Session 或Application 物件中的物件。在此之後,從另一個事務性頁面中呼叫會話作用域或應用程式作用域物件的嘗試都會失敗。
交易排隊從一個遠端伺服器對資料庫的更新可能因為網路延遲或故障而導致交易延遲或終止。因為事務的所有部分都必須提交,所以應用程式將可能掛起,等待遠端伺服器的提交或終止訊息,也可能由於無法發送資料庫更新而導致事務被放棄。
對於必須同時完成的更新,正確的做法是在事務的所有參與者都能夠提交之前,終止事務或推遲完成事務。例如,航空公司的定票程序應該同時完成對客戶的銀行帳號計入借方和對航空公司的銀行帳戶計入貸方。如果一個更新屬於事務整體的一部分,但可能晚於其他更新,您可能不希望讓客戶等待整個更新過程的完成。例如,機票預定事務可能也要向食品供應商發送食品訂單或更新客戶的旅程津貼。這些操作雖然也必須完成,但可以晚一點。
Microsoft Message Queue Server 可讓您將一個或一組更新捆綁到一個事務性訊息中送給遠端伺服器。 Message Queue Server 保證更新將傳送給遠端伺服器,即使目前網路不可用。您的應用程式將收到一個提交訊息,從而可以繼續處理事務。