方法一    利用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        

解决方案 »

  1.   

    方法二    可以利用数据库系统内部的事务处理机制,通过在数据库服务器中编写包含事务的存储过程,完成对数据操作的事务处理。同时,利用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
      

  2.   

    方法三    利用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    
      

  3.   

    拜托,楼上,这里是php,你发asp的
      

  4.   

    哈哈,我也没注意,跑php版来了.....把笨狼赶出去....
      

  5.   

    如果insert 第一个表成功chk=true;
    如果 chk==true 就执行第二个表 成功chk2==true;否则chk2=false;
    如果 chk2==false 就执行把第一个表刚插入的数据删除。(根据索引)
      

  6.   

    我好像在哪里见过,PHP也可以用事务提交的
      

  7.   

    我和SuperBJack(我想飞翔)想的差不多
      

  8.   

    begin
    (rollback)
    commit不行么?
      

  9.   

    楼上的方法直接在mysql客户端里用可以
    在php编程中不可以,我很久前就试过了
    现在还不知道怎么用php做事务处理呢,寻找中……
    希望高人不吝赐教
      

  10.   

    mysql 的innoDB类型的表支持事务,你查一下。
      

  11.   

    请问可以给出一个php设计的事务处理的具体代码吗?
    我是真的看不明白
      

  12.   

    http://www.php.net/manual/en/function.mysqli-rollback.php
      

  13.   

    事务解决方法,类似下面
    $db->query("START TRANSACTION");
    $sql="...";
    $a=$db->query($sql);
    if(isError($a))
    {
    $db->query("ROLLBACK");
    return false;
    }
    $sql="..";
    $a=$db->query($sql);
    if(isError($a))
    {
    $db->query("ROLLBACK");
    return false;
    }
    $db->query("COMMIT");
      

  14.   

    数据库支持事务处理,下载个adodb类库来用得了