Sql server 2005 .NET TransactionScopes和SQL 2005轻型事务管理器-多个连接是否使用相同的SPID?

Sql server 2005 .NET TransactionScopes和SQL 2005轻型事务管理器-多个连接是否使用相同的SPID?,sql-server-2005,transactions,transactionscope,Sql Server 2005,Transactions,Transactionscope,当使用SQL Lightweight transaction manager打开同一个DB的多个连接时,有人能解释一下幕后发生了什么吗 通过下面的代码,我们验证了在打开同一数据库的“多个连接”时确实不需要MSDTC 这是我测试的第一个场景:(Txn1和Txn2使用EntLib 4.1打开到同一个DB的连接并调用不同的存储过程) 从探查器跟踪发现,Txn1和Txn2使用了相同的连接SPID。调用Txn1()后,Sql SPID将被释放回池中,而Txn2()能够重用它 但是,当重复此实验并保持连接打

当使用SQL Lightweight transaction manager打开同一个DB的多个连接时,有人能解释一下幕后发生了什么吗

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

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

从探查器跟踪发现,Txn1和Txn2使用了相同的连接SPID。调用Txn1()后,Sql SPID将被释放回池中,而Txn2()能够重用它

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

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();
}
从事件探查器查看此消息表明,这两个事务仍在使用相同的SPID。我希望
TransactionScope
已升级为DTC,因为需要分布式事务来控制2个并发连接。我错过了什么?

引用

连接池减少了数量 新连接需要的次数 打开。普尔认为 物理连接的所有权。 它通过保持 激活的一组活动连接 每个给定的连接配置。 无论何时用户在 连接时,池处理程序会查看 中有可用的连接 游泳池。如果池连接是 如果可用,它会将其返回给调用者 而不是打开一个新的连接。 当应用程序调用Close on时 连接,池程序返回它 到活动的池集 连接而不是实际连接 关闭它。一旦连接断开 回到游泳池,它就准备好了 在下一次开放通话中重复使用


事务中使用了连接并不意味着它不能用于下一次调用。我发现,如果连接字符串有细微的变化,例如主机名的大小写,那么您将获得到db的新物理连接。

好的,我的误解是
DAAB
。 DAAB
数据库
根据需要打开和关闭连接(或从池中获取/释放连接),即在
DAAB数据库
对象的生命周期内不保留连接

可以在DAAB中手动控制数据库连接,如下所示-通过保持实际连接打开,它们不能被重用。这就要求MSDTC在两个物理连接打开后立即运行,正如我在原始问题中所预期的那样

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();
    }
}
Sql 2005还是Sql 2008?
如果使用sql 2008,则打开+关闭连接的顺序不会升级为分布式事务。但是所有连接必须使用完全相同的连接字符串

(伪代码)


sql2005中的相同代码升级为分布式事务-->yuo need MSDTC

谢谢Dan-这意味着EntLib DAAB数据库和物理连接之间没有1:1的相关性。谢谢Fabrizio-我在下面的帖子-我假设通过将我的DAAB数据库保持在范围内,连接将保持在范围内但事实并非如此。但你是对的-如果关闭并重新打开同一个conn,它将被重新分配。
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();
    }
}
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()
}