以下是引用片段: On Error Resume Next 第一步: 在事務環(huán)境下把用戶信息記入數據庫 If Err Then 關閉連接 退出 Else 第二步:創(chuàng)建文件夾 If Err Then 回滾第一步數據庫操作,退出 Else 第三步:在事務環(huán)境下操作日志數據庫 If Err Then 回滾第一步操作,刪除第二步建立的文件夾 退出 End If End If End If 提交第一步數據庫操作的事務 提交第二步數據庫操作的事務 End
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 %>
if conn.Errors.Count=0 then conn.CommitTrans '如果沒有conn錯誤,則執(zhí)行事務提交 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語句
if err.number =0 then conn.CommitTrans '如果沒有conn錯誤,則執(zhí)行事務提交 else conn.RollbackTrans '否則回滾 '回滾后的其他操作 strerr=err.Description Response.Write "數據庫錯誤!錯誤日志:font color=red>"strerr "/font>" Response.End end if %>