建立事務性指令碼 (用mts管理事務、組件)

來源:互聯網
上載者:User
建立|指令碼 商務應用程式常常需要具有在事務內部運行指令碼和組件的能力。事務是一種伺服器操作,即使該操作包括很多步驟(例如,定貨、查看存貨、付帳等),也只能整體返回操作是成功還是失敗。使用者可以建立在事務內部啟動並執行 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 指令:


value 參數可以是下列之一:

值 意義
Requires_New 啟動一個新的事務。
Required 啟動一個新的事務。
Supported 不啟動事務。
Not_Supported 不啟動事務。

@TRANSACTION 指令必須在一頁中的第一行,否則將產生錯誤。必須將該指令添加到需要在事務下啟動並執行每一頁中。當指令碼處理結束時,當前事務即告結束。

大多數應用程式只有一些特定的操作需要事務環境。例如,一個航空公司的網站可能只需要事務性指令碼處理購票和安排座位,而其他所有指令碼則無須事務環境即可安全運行。因為事務只須用於需要交易處理的頁即可,不要將應用程式的 Global.asa 檔案聲明為事務性。

如果事務被終止,Transaction Server 將恢複對支援事務的資源的任何更改。目前,僅資料庫伺服器完全支援事務,因為資料庫中的資料對於公司專屬應用程式是最為關鍵的。Transaction Server 不對硬碟上的檔案、會話和應用程式的變數、集合等的改變進行恢複。然而您可以如下文主題所述,通過編寫事務事件來編寫恢複變數和集合的指令碼。在某些時候,您的指令碼也可以顯式的提交或終止一個事務,如向檔案寫資料失敗時。

提交或終止指令碼
因為 Transaction Server 跟蹤交易處理,所以它決定事務是完全成功還是失敗。指令碼可以通過調用 ObjectContext.SetAbort 顯式地聲明終止一個事務。 例如,當一個事務在從一個組件收到錯誤訊息、違反商業規範時(例如,帳戶餘額小於 0)或讀寫檔案等非事務性操作失敗時,指令碼就需要終止該事務。如果頁在事務完成之前逾時,也必須終止事務。

編寫事務事件
指令碼本身不能決定事務是成功還是失敗。但是,可以編寫提交或終止事務時被調用的事件。例如,假設有一個確認銀行帳戶的指令碼,並且您需要針對事務的不同狀態將不同的頁返回給使用者,那麼就可以使用 OnTransactionCommit 和 OnTransactionAbort 事件來編寫對使用者的不同響應。





Welcome to the online banking service




Thank you. Your transaction is being processed.





在 MTS 資源管理員中登記一個組件
為了參與一個事務,組件必須在 MTS 包中登記,而且必須被配置為需要事務。例如,如果您的指令碼是通過調用兩個組件來處理訂單的,一個更新庫存資料庫,另一個更新付款資料庫。那麼,這兩個組件就要在同一個事務環境中運行。Transaction Server 保證如果任意一個組件失敗,那麼將不會有資料庫被更新。某些組件不需要事務;例如,Ad Rotator 組件。

註冊和配置事務性組件可使用 MTS 資源管理員。必須將事務的屬性設定為需要事務或需要新事務。事務組件必須在 MTS 包中註冊。不要將組件放在 IIS 內部進程包中,而應該建立自己的包。通常,應將所有的組件放在一個組件庫中。組件庫的組件可被多個 ASP 應用程式使用並以 ASP 應用程式進程運行。使用 MTS 資源管理員可建立新的包並將包的 Activation 屬性設定為 Library。

也可以在 Server 包中註冊事務性組件。Server 包通常以伺服器上的一個獨立的進程運行。如果希望使用基於職能組的安全性檢查或希望您的組件可被遠端電腦上的應用程式訪問,可對事務性組件使用 Server 包。

要使用 MTS 資源管理員,必須安裝 Microsoft Transaction Server。

對象範圍
一般情況下,不要將從 MTS 組件中建立的Object Storage Service在 ASP Application 或 Session 對象中。 MTS 對象在事務完成後消失。因為 Session 對象和 Application 對象是為在不同 ASP 頁之間使用的對象執行個體設計的,所以不要用它們儲存在事務結束時即被釋放的對象。

ASP 指令碼是已聲名的事務的根,即起始點。任何事務性 ASP 頁所使用的 MTS 對象都被認為是事務的一部分。當事務完成後,在頁中使用的 MTS 對象將消失,其中包括儲存在 Session 或 Application 對象中的對象。在此之後,從另一個事務性頁中調用會話範圍或Application 領域對象的嘗試都將失敗。

事務排隊
從一個遠程伺服器對資料庫的更新可能因為網路延遲或故障而導致事務延遲或終止。因為事務的所有部分都必須提交,所以應用程式將可能掛起,等待遠程伺服器的提交或終止訊息,也可能由於無法發送資料庫更新而導致事務被放棄。

對於必須同時完成的更新,正確的做法是在事務的所有參與者都能夠提交之前,終止事務或延遲完成事務。例如,航空公司的定票程式應該同時完成對客戶的銀行帳號計入借方和對航空公司的銀行帳戶計入貸方。如果一個更新屬於事務整體的一部分,但可能晚於其他更新,您可能不希望讓客戶等待整個更新過程的完成。例如,機票預定事務可能也要向食品供應商發送食品訂單或更新客戶的旅程津貼。這些操作雖然也必須完成,但可以晚一些。

Microsoft Message Queue Server 使您能夠將一個或一組更新捆綁到一個異動訊息中送給遠程伺服器。Message Queue Server 保證更新將被發送給遠程伺服器,即使目前網路不可用。您的應用將收到一個提交訊息,從而可以繼續處理事務。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。