我要把三个对于不同表Table1,Table2,Table3的操作整体作为一个事务处理,真对于这三个表有三个存储过程 Procedure1,Procedure2,Procedure3,而且每个存储过程的参数都不相同,我想问:1. 我觉得可以把三个存储过程合并起来,在存储过程中添加事务,这样做,在访问量较多的时候会不会出现问题。2. 我怎样在.net中添加事务,因为有三个存储过程,我需要建立三个Command对象,那么我能这样写吗?
    ……
    SqlTransaction trans=con.BeginTransaction();
    SqlComm1.Transaction=trans;
    SqlComm2.Transaction=trans;
    SqlComm3.Transaction=trans;    try
    {
       SqlComm1.ExecuteNonQuery();
       SqlComm2.ExecuteNonQuery();
       SqlComm3.ExecuteNonQuery();
       trans.Commit();
    }
    catch
    {
        trans.Rollback();
     }像我刚才的解决方法,大家平时都是怎么做的,还有其他的写法吗?

解决方案 »

  1.   

    这么写一定没有问题 SqlTransaction trans=con.BeginTransaction();
        try
        {
        SqlComm1.Transaction=trans;
        SqlComm1.commandtype = ....;SqlComm1.CommandText = proc1;
           SqlComm1.ExecuteNonQuery();SqlComm1.CommandText = proc2;
           SqlComm1.ExecuteNonQuery();SqlComm1.CommandText = proc3;
           SqlComm1.ExecuteNonQuery();       trans.Commit();
        }
        catch
        {
            trans.Rollback();
         }
      

  2.   

    对了,每次换proc的时候,记得也把SqlComm1.params.clear()一下
      

  3.   

    你这样写就错了,这不是三个事务了吗
      SqlComm1.Transaction=trans;
        SqlComm2.Transaction=trans;
        SqlComm3.Transaction=trans;给个示例看看,这是最基本写法
    protected int RunTransaction3(string procname1,string procname2,string procname3,IDataParameter[] para1,ArrayList ParaArray2,ArrayList ParaArray3) 

    //事务保证3个存储过程同步
    SqlCommand command1=BuildCommand(procname1);  Connection.Open();  SqlTransaction myTrans = Connection.BeginTransaction();  command1.Transaction = myTrans;  try 

    int result1=0;
    foreach(SqlParameter parameter in para1) 

    command1.Parameters.Add(parameter); 

    command1.Parameters.Add("@io_ErrorID",SqlDbType.Int,4); 
    command1.Parameters["@io_ErrorID"].Direction=ParameterDirection.Output; 
    command1.ExecuteNonQuery(); 
    result1=(int)command1.Parameters["@io_ErrorID"].Value; 
    if(result1!=1) 
    {
    myTrans.Rollback();  return -1;
    } int result2=0; 
    int error=0; 
    command1.CommandText=procname2; 
    foreach(object para in ParaArray2) 

    command1.Parameters.Clear(); 
    IDataParameter[] parameters=(IDataParameter[])para; 
    foreach(SqlParameter parameter in parameters) 

    command1.Parameters.Add(parameter); 

    command1.Parameters.Add("@ErrorID",SqlDbType.Int,4);
    command1.Parameters["@ErrorID"].Direction=ParameterDirection.Output; 
    command1.ExecuteNonQuery(); 
    result2=(int)command1.Parameters["@ErrorID"].Value; 
    if(result2!=1) 
    error=1; 

    if(error==1 

    myTrans.Rollback(); 
    return -1; 
    }  int result3=0;  command1.CommandText=procname3; 
    foreach(object para in ParaArray3) 

    command1.Parameters.Clear(); 
    IDataParameter[] parameters=(IDataParameter[])para; 
    foreach(SqlParameter parameter in parameters) 

    command1.Parameters.Add(parameter); 

    command1.Parameters.Add("@ErrorID",SqlDbType.Int,4); 
    command1.Parameters["@ErrorID"].Direction=ParameterDirection.Output; 
    command1.ExecuteNonQuery(); 
    result3=(int)command1.Parameters["@ErrorID"].Value; 
    if(result3!=1) 
    error=1; 

    if(error==1)//失败,回滚 

    myTrans.Rollback(); 
    return -1; 

    myTrans.Commit(); 
    return 1;
    }  catch(Exception ee) 

    try 

    string str=ee.Message;
    myTrans.Rollback(); 
    return -1; 
    //result=-1; 

    catch (SqlException ex) 

    string str1=ex.Message;
    return -1; 
    //result=-1; 
    }  } 
    finally 

    Connection.Close();  }  }