国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > ASP > 正文

Asp事務處理

2020-07-27 13:28:03
字體:
來源:轉載
供稿:網友
在編程中,經常需要使用事務。所謂事務,就是一系列必須都成功的操作,只要有一步操作失敗,所有其他的步驟也必須撤銷。比如用ASP開發一個網絡硬盤系統,其用戶注冊部分要做的事有:  
  1、將用戶信息記入數據庫  
  2、為用戶開個文件夾用于存儲  
  3、初始化用戶操作日志 

  這三步必須使用事務,否則萬一磁盤操作失敗,而沒有撤銷數據庫操作,就會造成只能登陸而不能操作的“死用戶”現象。 

  由于數據庫系統特殊的發展歷史,小至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使用腳本語言,功能就一定弱。

以下是引用片段:
<%  
'asp事務處理。  
'測試數據庫為sql server,服務器為本機,數據庫名為test,表名為a,兩個字段id(int)主鍵標識,num(int)  
set conn=server.CreateObject("adodb.connection")   
strConn="provider=sqloledb.1;persist security info=false;uid=sa;pwd=sa;Initial Catalog=test;Data Source=."  
conn.Open strConn  
'以上代碼建立數據庫連接  
conn.BeginTrans '事務開始  
strSql1="update a set num=1000 where id=24" '第一個sql語句為update。(語法正確)  
strSql2="insert into a(num) values('a')" '第二個sql語句為錯誤的sql語句  
strSql3="insert into a(num) values(33333)" '第三個sql語句為正確的sql語句   

call conn.execute(strSql1)   
call conn.execute(strSql2)   
call conn.execute(strSql3)   

if conn.Errors.Count=0 then   
conn.CommitTrans '如果沒有conn錯誤,則執行事務提交  
else   
conn.RollbackTrans '否則回滾  
end if  
%> 

以上代碼經調試,可以正常的進行事務處理。但是有時候,我們并不想將編譯錯誤顯示給用戶。 
則我們需要在conn.BeginTrans后面加上On error resume next 
但是因為用到了On error resume next。conn.Errors.Count只能獲得最后一個數據庫操作的conn返回的結果 。上面的三個sql語句,因為最后一個sql語句是正確的,則此事務處理就無效了。那我們需要對出錯處理作出相對應的修改。 
if conn.Errors.Count=0 then應該改為if err.number=0 then 
這樣,我們可以在數據庫回滾后同時做出其他相對應的操作或者提示。修改后的代碼如下: 
以下是引用片段:
<%  
set conn=server.CreateObject("adodb.connection")   
strConn="provider=sqloledb.1;persist security info=false;uid=sa;pwd=sa;Initial Catalog=test;Data Source=."  
conn.Open strConn  
'以上代碼建立數據庫連接  
conn.BeginTrans '事務開始  
on error resume next '增加的代碼  
strSql1="update a set num=1000 where id=24" '第一個sql語句為update。(語法正確)  
strSql2="insert into a(num) values('a')" '第二個sql語句為錯誤的sql語句  
strSql3="insert into a(num) values(33333)" '第三個sql語句為正確的sql語句   

call conn.execute(strSql1)   
call conn.execute(strSql2)   
call conn.execute(strSql3)   

if err.number =0 then   
conn.CommitTrans '如果沒有conn錯誤,則執行事務提交  
else   
conn.RollbackTrans '否則回滾  
'回滾后的其他操作  
strerr=err.Description  
Response.Write "數據庫錯誤!錯誤日志:<font color=red>"&strerr &"</font>"  
Response.End   
end if
%> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普格县| 德阳市| 九寨沟县| 景谷| 五家渠市| 白水县| 乌兰察布市| 阳山县| 宜春市| 崇明县| 贵港市| 安泽县| 张掖市| 南江县| 博乐市| 西安市| 肇东市| 太仓市| 木里| 富蕴县| 许昌市| 昭苏县| 丁青县| 东明县| 勃利县| 剑河县| 泰宁县| 五原县| 保靖县| 海兴县| 莱西市| 安化县| 额济纳旗| 湖北省| 金溪县| 嵊泗县| 海盐县| 贵南县| 辉县市| 辉南县| 泸水县|