在使用TransactionScope时 出错。(如果不使用事务则不出错)
以下是使用TransactionScope 这个的测试代码一周了,问题仍然没有解决,希望大家指教。
应用程序服务器与数据库服务器分别在不同的机器上。
string connectionString = @"Data Source=server\sql2005;Initial Catalog=DataTest;User ID=sa;Password=123456;enlist=true";
           using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
            {
                SqlParameter[] parameters =
                {
                    new SqlParameter("@UserName", SqlDbType.NVarChar,50),
                    new SqlParameter("@Fund", SqlDbType.Money)
                };
                parameters[0].Value = "admin";
                parameters[1].Value = 12.0;
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "User_UpdateFund";
                    cmd.Parameters.AddRange(parameters);
                    conn.Open();
                    cmd.ExecuteNonQuery();                                        
                }
                using (SqlConnection conn1 = new SqlConnection(connectionString))
                {
                    SqlParameter[] parameters1 =
                            {
                                new SqlParameter("@From", SqlDbType.NVarChar,50),
                                new SqlParameter("@To",SqlDbType.NVarChar,50),
                                new SqlParameter("@Fund", SqlDbType.Money)
                            };
                    parameters1[0].Value = "admin";
                    parameters1[1].Value = "agent";
                    parameters1[2].Value = 12.0;
                    SqlCommand cmd1 = new SqlCommand();
                    cmd1.Connection = conn1;
                    cmd1.CommandType = CommandType.StoredProcedure;
                    cmd1.CommandText = "FundLog_Add";
                    cmd1.Parameters.AddRange(parameters1);
                    conn1.Open();
                    cmd1.ExecuteNonQuery();
                }
                ts.Complete(); 

解决方案 »

  1.   

    http://blogs.msdn.com/dataaccess/archive/2006/02/14/532026.aspx
      

  2.   

    楼上的意思是说,只能使用一个Connection对象吗?
      

  3.   

    你也可以在服务器上启用DTC,不过从你的代码来看这是浪费
      

  4.   

    你也可以在服务器上启用DTC 很显然问题没有出在这儿,我的代码出是在 conn1.Open();这儿出错的。如果真正理解业务逻辑与数据访问的话,不会说我的代码是浪费,这是性能与可维护性的选择。上面的代码只是测试代码而已。
      

  5.   

    用一个Conn不会错,但是我想要使用两个Conn
      

  6.   

    有两方面问题要考虑,第一是MSDTC的配置问题,网上有很多文章介绍了这个问题,大概描述如下:
    控制面板/管理工具/组件服务/计算机/我的电脑/右键属性/MSDTC/安全性配置,在这个对话框里把你觉得需要的都勾起来。第二个问题很容易被忽视,就是防火墙设置,如果你用的是Windows自带的防火墙,把%systemroot%\system32\msdtc.exe加入例外就可以了。关于MSDTC和防火墙的问题,请参阅下面的文章:
    http://support.microsoft.com/default.aspx/kb/306843/en-us
      

  7.   

    MSDTC的配置问题:已经搜索了很多文章,配置基本上都试过,仍然不成功。
    防火墙设置:这个问题我注意了的,我关闭了防火墙的,我还禁用过防火墙来调试,问题仍然没有解决。
    问题最可能是出在MSDTC的配置问题,但是那个的那几个选择,基本是都试过。郁闷啊!
      

  8.   

    sql 2005支持轻量级事物,应该用不到DTC哦
      

  9.   

    数据库与应用程序不在同一台机器上,程序中使用了两个Conn,自然升级了分布式事务中了啊
      

  10.   

    你可以用一个connection factory,在当前事务打开了连接的时候使用现有连接,否则使用新连接
    我给你的链接里面有代码
      

  11.   

    你可以用一个connection factory,在当前事务打开了连接的时候使用现有连接,否则使用新连接
    我给你的链接里面有代码
    我看了那个代码,实际上他的哪个仍然是一个Connection,只是他做了封装,使用起来更方便。这样问题基本上能够解决,但是我在想,是不是用了两个不同的Connection就不能使用了呢?
      

  12.   

    根据错误信息就可以知道是 MSDTC事务没有成功
    还争什么 连接字符串的问题。。!!
      

  13.   

    连接数据库两次自动就把你的连接提升到DTC了,不开DTC当然会出错
      

  14.   

    根据错误信息就可以知道是 MSDTC事务没有成功
    还争什么 连接字符串的问题。。!!
    那你说说连接字符串错在哪儿了?连接数据库两次自动就把你的连接提升到DTC了,不开DTC当然会出错,我的DTC是开起了的。我使用那个Dping工具测试,已经通过了的。
      

  15.   

    Dping工具测试,已经通过了的
      

  16.   

    很顯然,同一個TransactionScope 里面是不能有兩個connection的
      

  17.   

    JDBC里面,事务管理是只能针对一个Connection的。
    MSDTC可以管理多个conn,我看你的代码里似乎没有关闭连接,不知道会不会是这个问题,建议检查一下。
      

  18.   

    using (SqlConnection conn = new SqlConnection(connectionString))
    这句就是关闭连接。
      

  19.   

    MSDN里的这个例子,能解决你的问题么?关闭Connection1的时机和你不同
    http://msdn2.microsoft.com/zh-cn/library/system.transactions.transactionscope(VS.80).aspx
      

  20.   

    我觉得应该是SQL2005不支持  我也是这个问题
      

  21.   

    SQL2008,我用Nhibernate没有一点问题