情形1:SqlConnection conn = new SqlConnection(ConfigContext.GetDBConnectString);
SqlTransaction tran;using (conn)
{
    conn.Open();    using (tran = conn.BeginTransaction())
    {
        try
        {
            //do sthing
            tran.Commit();  
        }
        catch
        {
            tran.Rollback();
        }
    }
}
情形2:
SqlConnection conn = new SqlConnection(ConfigContext.GetDBConnectString);
SqlTransaction tran;try
{
    using (conn)
    {
        conn.Open();        using (tran = conn.BeginTransaction())
        {            //do sthing
            tran.Commit();        }
    }
}
catch
{
    return false;
}
对于第一种,我想有很多缺点,1.conn.open这步没有加try catch,这样open可能失败而不被捕捉
2.try catch的目的仅仅是为了能手动rollback对于第二种我比较中意,但是我有几点担心,1.如果try块内出现异常,整个事务能不能rollback?或者至少跟rollback了一样
我想了想,如果我在commit之前使用了同一个tran的好几个sql命令,那么如果其中任意个出现异常,都会导致代码运行不到
commit,但是如果在commit的过程中出现了异常,比如,往前两个表里添加了数据,到第三个表的时候出现异常,那么此时
在大的catch里是无法捕捉到tran的,因为它的生命周期问题,那么此时的tran是整个都不会提交?还是提交了一部分,只要
你不手动rollback它就不会自己rollback,如果这样的话,我得必须采用1了,大家有什么好的建议??

解决方案 »

  1.   

    第2比第1个好点。
    你也可以多个try欠 套
      

  2.   

    晕 嵌套Try啊
    把俩结合起来啊 SqlConnection conn = new SqlConnection(ConfigContext.GetDBConnectString);
    SqlTransaction tran;try
    {
        using (conn)
        {
            conn.Open();        using (tran = conn.BeginTransaction())
            {         try
            {
                //do sthing
                tran.Commit();  
            }
            catch
            {
                tran.Rollback();
            }
            
    {} 
        }
    }
    catch
    {
        return false;
    }
      

  3.   

    恩,多层嵌套可以解决问题,我就是想,对了,对于第二种情况catch里还能访问到tran吗????我确实不太确定
    虽说tran的生命周期在using里,但如果出现异常的话,,,,,,so,那个大的catch能否访问到tran
      

  4.   

    using后tran被释放,貌似不能访问吧!
      

  5.   


     大的catch 不能访问到tran
    using完之后就出作用域了
      

  6.   

    tran = null;
    try
    {
       using(conn)
       {
            conn.open();
            using(tran = conn.beginTranfaction())
            {
                ....
            }
        }
    }
    catch
    {
         if( tran != null)
              tran.rollback();
    }