在程式設計中,經常需要使用事務。所謂事務,就是一系列必須都成功的操作,只要有一步操作失敗,所有其他的步驟也必須撤銷。例如用ASP開發一個網頁硬碟系統,其使用者註冊部分要做的事有:
將使用者資訊記入資料庫為使用者開個資料夾用於儲存初始化使用者操作日誌
這三步驟必須使用事務,否則萬一磁碟操作失敗,而沒有撤銷資料庫操作,就會造成只能登陸而無法操作的「死用戶」現象。
由於資料庫系統特殊的發展歷史,小至Access,大到DB2,無不帶有事務支援。因此上述步驟可以如下表示:
On Error Resume Next
第一步:
在交易環境下把使用者資訊記入資料庫
If Err Then
關閉連線退出Else
第二步:建立資料夾If Err Then
回滾第一步資料庫操作,退出Else
第三步:在交易環境下操作日誌資料庫If Err Then
回滾第一步操作,刪除第二步驟建立的資料夾退出End If
End If
End If
提交第一步資料庫操作的事務提交第二步資料庫操作的事務
End
每一步都需要進行判斷,如果失敗,還需要手動回滾前面多步驟操作,使程序變得複雜、難懂。如果今後更新了程序,增加其他步驟,還需要嵌套更多層的If...Else...End If,讓程序流程更加複雜。
正確的解決方法是使用ASP的事務控制功能。 IIS透過和MTS服務聯繫,可以控制多種支援事務的系統,當程式發出「失敗」的訊號時,所有支援事務的系統都會自動回滾,即使操作已正式完成;對不支援事務的操作也提供了方便的手工回滾方式。上面的例子用ASP交易控制功能重寫如下:
<%@ TRANSACTION = Required %>
On Error Resume Next
Set Conn=Server.CreateObject("ADODB.Connection")
Conn.Open ....
Conn.Execute "INSERT...."
Conn.Close
Set Conn=Nothing
Set Conn2=Server.CreateObject("ADODB.Connection")
Conn2.Open ....
Conn2.Execute "INSERT...."
Conn2.Close
Set Conn2=Nothing
Set FSO=Server.CreateObject("Scripting.FilesystemObject")
FSO.CreateFolder "...."
If Err Then
ObjectContext.SetAbort '通知所有支援事務的元件回滾,並執行手動回滾程式碼
Else
ObjectContext.SetComplete
End If
Set FSO=Nothing
Sub OnTransactionAbort
Response.Write "錯誤"
FSO.DeleteFile Server.Mappath("a.txt") 'FSO的手動回滾-刪除資料夾
End Sub
Sub OnTransactionCommit
Response.Write "勝利完成任務"
End Sub
%>
第一行的<%@ TRANSACTION = Required %>表示這一頁ASP檔案需要MTS的交易支援。中間的各個操作都以普通順序書寫,而不用考慮回滾問題。在程式最後判斷是否有錯誤。如果有,呼叫ObjectContext的SetAbort方法,IIS會透過MTS服務通知所有支援交易的元件回滾(主要是資料庫),並且執行Sub OnTransactionAbort對不支援交易的操作手動回滾;如果沒有發生錯誤,呼叫ObjectContext的SetComplete方法,則會執行Sub OnTransactionCommit來顯示成功的訊息。
整個ASP程式不需要為判斷錯誤和回滾操作書寫多餘的程式碼,只須在最後進行判斷,即使今後增加了多步驟操作,也只需要在Sub OnTransactionAbort中進行控制即可,非常方便,程式設計師可以專注於過程編寫而不是書寫糾錯程式碼。
其實ASP也提供了許多更有用的功能,等我們使用,千萬不要以為ASP使用腳本語言,功能就一定很弱。