商業(yè)應(yīng)用程序常常需要具有在事務(wù)內(nèi)部運(yùn)行腳本和組件的能力。事務(wù)是一種服務(wù)器操作,即使該操作包括很多步驟(例如,定貨、查看存貨、付帳等),也只能整體返回操作是成功還是失敗。用戶可以創(chuàng)建在事務(wù)內(nèi)部運(yùn)行的ASP腳本,如果腳本的任何一部分失敗,整個(gè)事務(wù)都將會(huì)終止。
ASP事務(wù)處理是以MicrosoftTransactionServer(MTS)為基礎(chǔ)的。MicrosoftTransactionServer(MTS)是一個(gè)事務(wù)處理系統(tǒng),用于開(kāi)發(fā)、配置和管理高性能、可分級(jí)的、有魯棒性的企業(yè)Internet和Intranet服務(wù)器應(yīng)用程序。TransactionServer為開(kāi)發(fā)分布式的,基于組件的應(yīng)用程序提供了一個(gè)應(yīng)用程序設(shè)計(jì)模型。它也為配置和管理這些應(yīng)用程序提供了一個(gè)運(yùn)行環(huán)境。
創(chuàng)建事務(wù)性腳本的功能內(nèi)置在InternetInformationServer和PersonalWebServer中。如果您安裝了MicrosoftTransactionServer,就可以將組件打包,以使組件在事務(wù)內(nèi)部運(yùn)行。
關(guān)于事務(wù)
事務(wù)是整體成功或失敗的操作。事務(wù)處理用于對(duì)數(shù)據(jù)庫(kù)進(jìn)行可靠地更新。在對(duì)數(shù)據(jù)庫(kù)進(jìn)行許多相關(guān)更改或同時(shí)更新多個(gè)數(shù)據(jù)庫(kù)時(shí),要保證所有更改都被正確執(zhí)行。如果這些更改中的任何一個(gè)失敗,都需要恢復(fù)數(shù)據(jù)庫(kù)表的原始狀態(tài)。
如果沒(méi)有MTS,您就需要編寫(xiě)腳本和組件,手工跟蹤請(qǐng)求的更改情況,以便在某些更改失敗時(shí)恢復(fù)數(shù)據(jù)。使用MTS,您只需簡(jiǎn)單的將您的腳本和組件聲明為“需要事務(wù)”并讓MTS處理事務(wù)的一致性。事務(wù)處理只適用于數(shù)據(jù)庫(kù)訪問(wèn);MTS不能對(duì)文件系統(tǒng)或其他的非事務(wù)性資源的更改進(jìn)行恢復(fù)操作。應(yīng)用程序所訪問(wèn)的數(shù)據(jù)庫(kù)必須為MTS所支持。目前,MTS支持SQLServer及任何支持XA協(xié)議(由X/Open協(xié)會(huì)制定)的服務(wù)器。MTS將繼續(xù)擴(kuò)展對(duì)其他數(shù)據(jù)庫(kù)的支持。
事務(wù)不能跨越多個(gè)ASP頁(yè)。如果一個(gè)事務(wù)需要來(lái)自多個(gè)組件的對(duì)象,則須將使用這些對(duì)象的操作組合在一個(gè)ASP頁(yè)中。例如,假定有一個(gè)組件用于更新工資單數(shù)據(jù)庫(kù),還有一個(gè)組件用于更新人力資源數(shù)據(jù)庫(kù)中的員工記錄。為了記錄一個(gè)員工的新的工資信息,您需要編寫(xiě)這樣一個(gè)腳本,該腳本在一個(gè)事務(wù)環(huán)境中調(diào)用這兩個(gè)組件,一個(gè)用于更新工資單數(shù)據(jù)庫(kù),另一個(gè)用于更新人力資源數(shù)據(jù)庫(kù)中的員工等級(jí)。
聲明事務(wù)性腳本
在將一個(gè)頁(yè)聲明為事務(wù)性時(shí),此頁(yè)中的任何腳本命令和對(duì)象都運(yùn)行在同一個(gè)事務(wù)環(huán)境中。TransactionServer處理生成事務(wù)的細(xì)節(jié)并決定事務(wù)成功(提交)或失?。ńK止)。要將某個(gè)頁(yè)聲明為事務(wù)性,可在頁(yè)首添加@TRANSACTION指令:
value參數(shù)可以是下列之一:
值意義
Requires_New啟動(dòng)一個(gè)新的事務(wù)。
Required啟動(dòng)一個(gè)新的事務(wù)。
Supported不啟動(dòng)事務(wù)。
Not_Supported不啟動(dòng)事務(wù)。
@TRANSACTION指令必須在一頁(yè)中的第一行,否則將產(chǎn)生錯(cuò)誤。必須將該指令添加到需要在事務(wù)下運(yùn)行的每一頁(yè)中。當(dāng)腳本處理結(jié)束時(shí),當(dāng)前事務(wù)即告結(jié)束。
大多數(shù)應(yīng)用程序只有一些特定的操作需要事務(wù)環(huán)境。例如,一個(gè)航空公司的站點(diǎn)可能只需要事務(wù)性腳本處理購(gòu)票和安排座位,而其他所有腳本則無(wú)須事務(wù)環(huán)境即可安全運(yùn)行。因?yàn)槭聞?wù)只須用于需要事務(wù)處理的頁(yè)即可,不要將應(yīng)用程序的Global.asa文件聲明為事務(wù)性。
如果事務(wù)被終止,TransactionServer將恢復(fù)對(duì)支持事務(wù)的資源的任何更改。目前,僅數(shù)據(jù)庫(kù)服務(wù)器完全支持事務(wù),因?yàn)閿?shù)據(jù)庫(kù)中的數(shù)據(jù)對(duì)于企業(yè)應(yīng)用是最為關(guān)鍵的。TransactionServer不對(duì)硬盤(pán)上的文件、會(huì)話和應(yīng)用程序的變量、集合等的改變進(jìn)行恢復(fù)。然而您可以如下文主題所述,通過(guò)編寫(xiě)事務(wù)事件來(lái)編寫(xiě)恢復(fù)變量和集合的腳本。在某些時(shí)候,您的腳本也可以顯式的提交或終止一個(gè)事務(wù),如向文件寫(xiě)數(shù)據(jù)失敗時(shí)。
提交或終止腳本
因?yàn)門(mén)ransactionServer跟蹤事務(wù)處理,所以它決定事務(wù)是完全成功還是失敗。腳本可以通過(guò)調(diào)用ObjectContext.SetAbort顯式地聲明終止一個(gè)事務(wù)。例如,當(dāng)一個(gè)事務(wù)在從一個(gè)組件收到錯(cuò)誤消息、違反商業(yè)規(guī)范時(shí)(例如,帳戶余額小于0)或讀寫(xiě)文件等非事務(wù)性操作失敗時(shí),腳本就需要終止該事務(wù)。如果頁(yè)在事務(wù)完成之前超時(shí),也必須終止事務(wù)。