SQL事務回滾 ADO BeginTrans, CommitTran 以及 RollbackTrans 方法


SQL事務回滾 ADO BeginTrans, CommitTran 以及 RollbackTrans 方法
 

定義和用法

這三個方法與 Connection 對象使用,來保存或取消對數據源所做的更改。

注釋:並非所有提供者都支持事務。

注釋:BeginTrans、CommitTrans 和 RollbackTrans 方法在客戶端 Connection 對象上無效。

那客戶端不能支持事務? 這是什么意思?

BeginTrans

BeginTrans 方法可開始一個新事務。

CommitTrans

CommitTrans 方法可保存自最后一個 BeginTrans 方法調用以來的所有更改,並結束當前事務。它也可能啟動新事務。

RollbackTrans

RollbackTrans 方法可取消自最后一次 BeginTrans 方法調用以來的所有更改,並結束該事務。它也可能啟動新事務。

說明

對於支持嵌套事務的提供者,在打開的事務中調用 BeginTrans 方法將啟動新的嵌套事務。返回值將指示嵌套層次:返回值為“1”指示打開了頂層事務(即此事務未嵌套在其他事務中),返回值為“2”指示打開了第二層事務(嵌套在頂層事務中的事務),依此類推。調用 CommitTrans 或 RollbackTrans 只影響最新打開的事務;在處理任何更高層事務之前必須關閉或回卷當前事務。

語法

level=objconn.BeginTrans()

objconn.BeginTrans

objconn.CommitTrans

objconn.RollbackTrans
例:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標題文檔</title>
</head>

<body>
務回滾將用戶指定的事務回滾到事務內上一個保存點或事務的起始

列1-----------------------------------------------------------------

<%'啟動一個事務操作
%>
<%
id=request("id")
cont=request("cont")
ps="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("test.mdb")
Set Conn=Server.CreateObject("ADODB.CONNECTION")
conn.open ps%>
<% Conn.BeginTrans
%>
<% sqlText="Insert into b1(id2) values("&id&")" %>
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0 then
%>
<% conn.Errors.Clear %>
<%'如果插入數據操作失敗,則事務向前回滾
%>
<% conn.RollBackTrans %>
<% response.write "RegisterFail.html"
%>
<% end if
%>
<% sqlText="Insert into b2(id,content) values("&id&",'"&cont&"')" %>

<%//執行事務單元中的第二條插入語句
conn.execute(sqlText) %>
<% if conn.Errors.Count>0 then %>
<% conn.Errors.Clear
%>

<%'//如果操作失敗,則事務向前回滾
conn.RollBackTrans
%>
<% response.write "RegisterFail.html" %>
<% end if %>

<%'如果整個事務操作執行正確,則提交事務
Conn.CommitTrans
%>

<%'轉向注冊成功處理提示
response.write "RegisterOk.html" %>

列2----------------------------------------------------------

<%
'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.Deion
Response.Write "數據庫錯誤!錯誤日志:<font color=red>"&strerr &"</font>"
Response.End
end if

%>

</body>
</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM