事务

方法一   

利用ASP内置ADO组件中的Connection对象可以实现对数据库操作的事务性处理。Connection对象的部分方法如下:   

●Connection.BeginTrans方法:启动一个事务;   

●Connection.CommitTrans方法:完成/提交一个事务;   

●Connection.RollBackTrans方法:撤消/放弃一个事务。   

//启动一个事务操作   

  Conn.BeginTrans       

  sqlText=“Insert  into  USER(userName,userPasswd)  values(‘”     

  sqlText=sqlText  &  request(“usrName”)  &  “’,‘”&request(“usrPasswd”)&“’)  ”     

  conn.execute(sqlText)     

  if  conn.Errors.Count>0  then       

  conn.Errors.Clear     

//如果插入数据操作失败,则事务向前回滚   

  conn.RollBackTrans       

  response.Redirct  RegisterFail.html     

  end  if     

  sqlText=“Insert  into  USERDOC(userName,Age,Sex,PhoneNumber,Address)  ”   

  sqlText=sqlText  &  “values(‘”&  request   

(“usrName”)  &  “’,  ”  &  request(“Age”)     

  sqlText=sqlText  &  “,‘”  &  request   

(“PhoneNum”)  &  “’,‘”     

  sqlText=sqlText  &  request(“Address”)  &  “’)  ”     

//执行事务单元中的第二条插入语句   

  conn.execute(sqlText)       

  if  conn.Errors.Count>0  then     

  conn.Errors.Clear     

//如果操作失败,则事务向前回滚   

  conn.RollBackTrans       

  response.Redirct  RegisterFail.html     

  end  if     

//如果整个事务操作执行正确,则提交事务   

  Conn.CommitTrans       

//转向注册成功处理页面   

  response.Redirct  RegisterOk.html       

 

方法二   

可以利用数据库系统内部的事务处理机制,通过在数据库服务器中编写包含事务的存储过程,完成对数据操作的事务处理。同时,利用ADO组件调用存储过程,还可以根据存储过程的返回代码判断事务处理是否执行成功。   

在数据库系统中,每一条SQL语句都是一个事务。因此可以保证每条语句要么完成,要么退回到开始之处。但是如果希望一组SQL语句的操作要么全部完成,要么全部无效,就需要利用数据库的事务处理机制来实现。   

在数据库中生成存储过程的主要代码如下:   

Create  proc  RegisterUser   

(@usrName  varchar(30),  @usrPasswd  varchar(30),@age  int,  @PhoneNum  varchar(20),  @Address  varchar(50)  )   

as   

begin   

//显示定义并开始一个事务   

begin  tran     

insert  into  USER(userName,userPasswd)  values(@usrName,@usrPasswd)   

if  @@error<>0   

begin   

//操作失败,则事务回滚   

rollback  tran     

//返回存储过程,并设置返回码为事务操作失败   

return  -1     

end   

insert  into  USERDOC(userName,age,sex,PhoneNumber,Address)     

values(@Usrname,@age,@PhoneNum,@Address)   

if  @@error<>0   

begin   

//操作失败,则事务回滚   

rollback  tran     

return  -1   

end   

//如果操作执行正确,则提交事务   

commit  tran     

return  0   

end   

在ASP脚本中调用数据库存储过程的主要代码如下:   

  Set  Comm=server.CreateObject   

(“ADODB.Command”)     

  Set  Comm.ActiveConnection=conn     

  Comm.CommandType=adCmdStoredProc     

  Comm.CommandText=“RegisterUser”     

//创建存储过程返回参数对象   

  Set  RetCode=Comm.CreateParameter   

(“RetCode”,adInteger,adParamReturnValue)       

//创建存储过程输入参数对象   

  Set  usrName=Comm.CreateParameter   

(“usrName”,adVarchar,adParamInput,30)       

  Set  usrPwd=Comm.CreateParameter   

(“usrPasswd”,adVarchar,adParamInput,30)     

  Set  age=Comm.CreateParameter(“age”,adInteger,adParamInput)     

  Set  PhoneNum=Comm.CreateParameter   

(“PhoneNum”,adVarchar,adParamInput,  20)     

  Set  Address=Comm.CreateParameter(“Address”,adVarchar,adParamInput,50)     

  Comm.Parameters.Append  usrName     

  Comm.Parameters.Append  usrPwd     

  Comm.Parameters.Append  age     

  Comm.Parameters.Append  PhoneNum     

  Comm.Parameters.Append  Address     

  Comm.Parameters(“usrName”)=request   

(“usrName”)     

  Comm.Parameters(“usrPasswd”)=request   

(“usrPasswd”)     

  Comm.Parameters(“age”)=request(“age”)     

  Comm.Parameters(“PhoneNum”)=request   

(“PhoneNum”)     

  Comm.Parameters(“Address”)=request   

(“Address”)     

  Comm.Execute     

  RetValue=Cint(Comm(“RetCode”))     

//根据数据库存储过程返回代码判断注册是否成功   

  if  RetValue<  0  then       

  response.Redirect  RegisterFail.html     

  else     

  response.Redirect  RegisterOk.html     

  end  if

 

方法三   

利用MTS(Microsoft  Transaction  Server)组件的事务处理机制实现事务处理时,需要特别注意的是,这种机制下的事务不能跨越多个ASP页,如果一个事务处理需要来自多个组件的对象,则须将对这些对象的操作组合在一个ASP页中。   

首先需要在页首添加指令@TRANSACTION,将一个ASP页面声明为事务性。@TRANSACTION指令必须在一页中的第一行,否则将产生错误。当页面中ASP脚本处理结束时,当前事务即告结束。   

@  TRANSACTION=Required  Language=   

VB  Script     

//事务执行成功触发事件   

  Sub  OnTransactionCommit()       

  response.Redirect  RegisterOk.html     

  End  Sub     

//事物执行失败触发事件   

  Sub  OnTransactionAbort()       

  response.Redirect  RegisterFail.html     

  End  Sub     

  sqlText=“Insert  into  USER(userName,userPasswd)  values(‘”     

  sqlText=sqlText  &  request(“usrName”)  &  “’,‘”  &request(“usrPasswd”)&“’)  ”     

  conn.execute(sqlText)     

  if  conn.Errors.Count>0  then     

  conn.Errors.Clear     

  ObjectContext.SetAbort     

  end  if     

  sqlText=“Insert  into  USERDOC(userName,Age,Sex,PhoneNumber,Address)  ”   

  sqlText=sqlText  &  “values(‘”  &  request   

(“usrName”)&  “’,  ”  &  request(“Age”)     

  sqlText=sqlText  &  “,’”  &  request   

(“PhoneNum”)  &  “’,‘”     

  sqlText=sqlText  &  request(“Address”)  &  “’)  ”     

  conn.execute(sqlText)     

  if  conn.Errors.Count>0  then     

  conn.Errors.Clear     

  ObjectContext.SetAbort     

  end  if     

  ObjectContext.SetComplete     

 

方案比较   

从灵活的角度考虑,选择采用ASP数据库组件的方法具有一定的优势:既可以选用ADO数据库组件完成事务处理,同时还可以根据实际需要,定制自己的数据库组件(只要满足ASP组件编写规范即可)。如果从数据库事务处理的可靠性等角度考虑,则采用数据库内部的事务处理存储过程更好。这样可以直接利用数据库事务机制完成应用程序的逻辑事务处理,安全可靠,并且减少了Web服务器与数据库服务器之间的数据交互。这一点对分布式数据库系统尤为重要。采用MTS组件的事务处理方法的优势在于:由MTS服务器直接控制和管理组件(在MTS中注册的组件)操作的完成和撤消,具有良好的扩展空间和应用前景,可以充分发挥MTS的技术优势,增强网络应用的容错性能,提高IIS  Web服务器的动态性能。   

 

--------------------------------------------------------------- 

 

  connection名称.begintrans 

        on  error  goto  errdeal   

        事务…… 

errdeal: 

        connection名称.rollback 

        connection名称.commits 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值