julyclyde(原作)
作者系2月份微軟社區之星Microsoft China Community Star
在編程中,經常需要使用事務。所謂事務,就是一系列必須都成功的操作,只要有一步操作失敗,所有其他的步驟也必須撤銷。比如用ASP開發一個網絡硬盤系統,其用戶注冊部分要做的事有:
將用戶信息記入數據庫
為用戶開個文件夾用于存儲
初始化用戶操作日志
這三步必須使用事務,否則萬一磁盤操作失敗,而沒有撤銷數據庫操作,就會造成只能登陸而不能操作的“死用戶”現象。
由于php?/%CA%FD%BE%DD%BF%E2%CF%B5%CD%B3' target='_blank'>數據庫系統特殊的發展歷史,小至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的事務支持。中間的各個操作都按普通順序書寫,而不用考慮
新聞熱點
疑難解答