一个主表:table1,一个行表:table2现在要实现的是,当插入主表table1后会返回一个值,这个为插入后自动生成的一个主键,然后根据这个主键在插入行表table2.
如果中间步骤断了,则删除主表table1中的数据。这个功能我是分为两个步骤实现的,所以没有实现回滚,请教一下前辈们,如果要控制它事务回滚怎么写代码?

解决方案 »

  1.   

    像你说的这种情况,最好使用存储过程,如果不使用存储过程的话,那就用一个回滚,回滚有一个 conn.BegionTr...和 conn.EndTr..的一个方法组。
      

  2.   

    如下为伪代码:
     connection.Open();
     transaction = connection.BeginTransaction();
    try
    {
     command = new Command(connection);
     command.CommandText = "插入表1的SQL";
     id = command.Excute();
     command.CommandText = "插入表2的SQL,关联id";
     command.Excute()
     transaction.Commit();
    }
    catch
    {
     transaction.Rollback();
    }
      

  3.   

    我没有用存储过程,用SQL语句实现。楼上的方法我先试试
      

  4.   

    可以考虑用触发器啊。哈哈但是一般不推荐用//执行事务处理
    public void DoTran()
    {  //建立连接并打开
     SqlConnection myConn=GetConn();
     myConn.Open();
     SqlCommand myComm=new SqlCommand();
     //SqlTransaction myTran=new SqlTransaction();
     //注意,SqlTransaction类无公开的构造函数
     SqlTransaction myTran;
     //创建一个事务
     myTran=myConn.BeginTransaction();
     try
     {
      //从此开始,基于该连接的数据操作都被认为是事务的一部分
      //下面绑定连接和事务对象
      myComm.Connection=myConn;
      myComm.Transaction=myTran; //定位到pubs数据库
      myComm.CommandText="USE pubs";
      myComm.ExecuteNonQuery();//操作1
      myComm.CommandText=""; //操作2
      myComm.ExecuteNonQuery();
       //提交事务
      myTran.Commit();
     }
     catch(Exception err)
     {
      myTran.rollback();
      throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
      }
     finally
     {
      myConn.Close();
      }
    }
      

  5.   

    1.c#代码中实现(最好封装起来传入string[] sqlArray)
    2.数据库使用数据库事务
    3.触发器(触发器尽量少用,如果数据迁移或者文档不详细会死的很惨)