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