瓜西西

导航

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>

 

posted on 2012-03-27 12:20  瓜西西  阅读(4249)  评论(0编辑  收藏  举报