代码之家  ›  专栏  ›  技术社区  ›  StuartLC

.NET TransactionScopes和SQL 2005轻型事务管理器-同一SPID的多个连接?

  •  0
  • StuartLC  · 技术社区  · 14 年前

    Microsoft Data Access Application Block (DAAB)

    通过下面的代码,我们验证了在打开同一数据库的“多个连接”时确实不需要MSDTC。

    这是我测试的第一个场景:(Txn1和Txn2使用entlib4.1打开到同一个DB的连接并调用不同的存储过程)

    using (var ts = new TransactionScope(TransactionScopeOption.Required))
    {
        DAL1.Txn1();
        DAL2.Txn2();
        ts.Complete();
    }
    

    但是,当重复此实验并保持连接打开时:

    using (var ts = new TransactionScope(TransactionScopeOption.Required))
    {
        Database db1 = DatabaseFactory.CreateDatabase("db1");
        DAL1.Txn1OnCon(db1);
        Database db2 = DatabaseFactory.CreateDatabase("db1");
        DAL2.Txn2OnCon(db2);
        ts.Complete();
    }
    

    TransactionScope 作为分布式事务升级到DTC,应要求控制2个并发连接。我错过了什么?

    3 回复  |  直到 10 年前
        1
  •  1
  •   Dan    14 年前

    引用自 MSDN http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.80).aspx

    新的连接需要 打开。游泳池维护 它通过保持 活动的一组活动连接 每个给定的连接配置。 每当用户在 连接,池中人看是否 中有可用的连接 游泳池。如果池连接 如果可用,则返回给调用者 而不是打开新连接。 连接,池程序返回它 到集合的活动 连接而不是实际连接 关闭它。一旦连接断开 回到游泳池,就准备好了 在下一次通话中重复使用。

    仅仅因为事务中使用了连接并不意味着它不能用于下一次调用。我发现,如果连接字符串的变化很小,比如主机名的大小写,那么您就可以获得到数据库的新物理连接。

        2
  •  1
  •   Fabrizio Accatino    14 年前

    Sql 2005还是Sql 2008?

    (伪码)

    string connstring = "...."
    using (TransactionScope ts=...)
    {
      c1 = new connection(connstring );
      c1.open
      ...use c1
      c1.close
    
      c2 = new connection(connstring );
      c2.open
      ...use c2
      c2.close
    
      ts.complete()
    }
    

        3
  •  0
  •   StuartLC    10 年前

    好吧,我的误解是 DAAB . 达布 Database 没有举行 DAAB Database 对象。

    using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
    {
        using (DbConnection dbConn1 = DatabaseFactory.CreateDatabase("myDb").CreateConnection())
        using (DbConnection dbConn2 = DatabaseFactory.CreateDatabase("myDb").CreateConnection())
        {
            dbConn1.Open();
            DAL1.Txn1OnCon(dbConn1);
            dbConn2.Open();
            DAL2.Txn2OnCon(dbConn2);
            DAL1.Txn1OnCon(dbConn1);
            ts.Complete();
        }
    }