SQL事物--回滚

来源:互联网 发布:图文教程制作软件 编辑:程序博客网 时间:2024/04/29 15:43

给你一个例子:  
   
   BEGIN   TRAN     --开始一个事务  
    INSERT   INTO   PRODUCT(PRODUCTID,   PRODUCTNAME)   VALUES("0001",   "KEYBOARD")  
    UPDATE   PRODUCT   SET   PRICE=12   WHERE   PRODUCTID=   "0002"  
    IF   (@ERROR>0)    
     ROLLBACK     --执行语句失败,则回滚到开始处  
    ELSE  
   COMMIT   --提交事务

 

 

没有关系的,你只要加入一个BEGINTRANSCATION和一个ENDTRANSCATION.数据库会将这里面的SQL处理批量执行,当中间出现一条错误时你可以ROLLBACK,这样就会全部都取消掉,也就是说都不会执行。

 

 

在数据库中使用事务:  
  SET   XACT_ABORT   ON     --当产生错误时自动回滚事务  
  BEGIN   TRAN  
  ......  
  COMMIT   TRAN  
   
  也可以在代码中使用事务:  
  SqlTransaction   tran   =   sqlConn.BeginTransaction();  
  try  
  {  
      ......  
      tran.Commit();  
  }  
  catch  
  {  
      tran.Rollback();  
  }   
 

 

很多数据库操作需要进行事务,Asp.net下面进行事务大致有3个层次:      
  (1)存储过程层次的事务      
  (2)Ado.Net层次的事务      
  (3)Asp.Net页面层次的事务      
  下面分别举例:      
  首先建立trantest表,字段id(int),test(char)      
  为id设置主键(利用主键是不允许重复的特性进行事务测试)      
  假设数据库内存在记录id=1,test='test'    
  (1)      
  CREATE   PROCEDURE   Tran1      
  as      
  begin   tran      
  set   xact_abort   on    
  Insert   Into   trantest   (id,test)values(1,'test')      
  Insert   Into   trantest   (id,test)values(2,'test')      
  commit   tran      
  GO      
  set   xact_abort   on     表示遇到错误立即回滚    
  当然你也可以这么写    
  CREATE   PROCEDURE   tran1    
  as    
  begin   tran    
  insert   into   trantest(id,test)values(1,'test')    
  if(@@error<>0)    
    rollback   tran    
  else    
    begin    
      insert   into   trantest(id,test)values(2,'test')    
      if(@@error<>0)    
        rollback   tran    
      else    
        commit   tran    
    end    
  GO    
   
  (2)      
  SqlConnection   conn=new   SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);      
  SqlCommand   cmd1=new   SqlCommand("Insert   Into   trantest   (id,test)values(1,'test')",conn);      
  SqlCommand   cmd2=new   SqlCommand("Insert   Into   trantest   (id,test)values(1,'test')",conn);      
  conn.Open();      
  SqlTransaction   tran=conn.BeginTransaction();      
  cmd1.Transaction=tran;      
  cmd2.Transaction=tran;      
  try      
  {      
    cmd1.ExecuteNonQuery();      
    cmd2.ExecuteNonQuery();      
    tran.Commit();      
  }      
  catch(SqlException   except)      
  {      
    tran.Rollback();      
    Response.Write(except.Message);      
  }      
  finally      
  {      
    conn.Close();      
  }      
   
  (3)      
  添加引用System.EnterpriseServices.dll      
  using   System.EnterpriseServices;      
   
  随便建立一个按钮,在按钮中进行如下操作:    
  try      
  {      
    work1();      
    work2();      
    ContextUtil.SetComplete();      
  }      
  catch(System.Exception   except)      
  {      
    ContextUtil.SetAbort();      
    Response.Write(except.Message);      
  }      
   
  然后在页面中添加2个操作,模拟一下在逻辑层调用不同类中的操作的情况      
  private   void   work1()      
      {      
        SqlConnection   conn=new   SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);      
        SqlCommand   cmd1=new   SqlCommand("Insert   Into   trantest   (id,test)values(1,'test')",conn);      
        conn.Open();      
        cmd1.ExecuteNonQuery();      
        conn.Close();      
      }      
   
      private   void   work2()      
      {      
        SqlConnection   conn=new   SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);      
        SqlCommand   cmd2=new   SqlCommand("Insert   Into   trantest   (id,test)values(2,'test')",conn);      
        conn.Open();      
        cmd2.ExecuteNonQuery();      
        conn.Close();      
      }      
   
  修改前台页面在<%Page后面添加   Transaction="Required"   即可    

 

 

 

方法3:

把所有的SQL都放到一个事务中  
  BEGINTRANSCATION  
        。。。  
  ENDTRANSCATION

原创粉丝点击