using (TransactionScope tsCope = new TransactionScope(TransactionScopeOption.Required))
            {
                string sql = "insert into t_test(id) values(1)";
                OracleConnection conn = new OracleConnection("Data Source=frame;User Id=yhgx;Password=yhgx;");
                OracleCommand cmd = new OracleCommand(sql, conn);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();                string sql1 = "insert into t_test(id) values('fgag')";
                OracleConnection conn1 = new OracleConnection("Data Source=frame;User Id=yhgx;Password=yhgx;");
                OracleCommand cmd1 = new OracleCommand(sql1, conn1);
                conn1.Open();
                cmd1.ExecuteNonQuery();
                conn1.Close();                tsCope.Complete();
            }能说明下为什么事务不回滚吗?

解决方案 »

  1.   

    估计他为了测试能用 connection 上的事务的尽量用,
    最好不要把 windows 组件服务的事务管理牵扯进来,
    对 .net 的突增复杂性和难度.
      

  2.   

    能用 connection 上的事务的尽量用,
    最好不要把 windows 组件服务的事务管理牵扯进来,
    对 .net 的突增复杂性和难度.
      

  3.   

    using(TransactionScope scope = new TransactionScope())
    {
    //方法1   
    //方法2:  
    scope.Complete();

     
    没有异常正常
      

  4.   

    我的最终目的也想这么用,但是现在不回滚呀,在sqlserver数据库测试可以回滚,在oracle数据库不可以,请指教
      

  5.   

    按楼上所说的 估计是  msdtc的原因   sql是ms的 oracle不是 。  可以去博客看看   c#的事务系列     http://blog.csdn.net/shellwin/archive/2010/08/23/5832286.aspx
      

  6.   

    问题的关键是这一句:[color=#FF0000]tsCope.Complete();[/color]
    只要执行了Complete()方法,就会被认为是进行提交,你试下删除或注释掉这一句,就会发现上面的执行都不会成功的.
    因此,要想在TransactionScope中实现回滚,唯一的作法就是使用Try{}Catch{},或者行判断语句的执行状态,只有当所有语句执行结果都正确的时候,才调用Complete()方法, 执行不正确则不调用(相当于默认回滚)
    例如:
    using(TransactionScope scope = new TransactionScope())
    {
      try{
        //方法1 
        //方法2: 
        //正确执行完以上代码后,调用以下提交
        scope.Complete();
      }
      catch(exception ex)
      {
        //出错信息(如果出错则不会提交,事务自动回滚)
      }