C# IsolationLevel.ReadUncommitted在与SQL Server 2008的不同连接上阻止读取

C# IsolationLevel.ReadUncommitted在与SQL Server 2008的不同连接上阻止读取,c#,transactions,timeout,C#,Transactions,Timeout,嗨,当调用代码有一个挂起的事务时,我在从数据库读取时遇到了一个问题。像这样: f1() { DbTransaction t = Connection1.BeginTransaction(IsolationLevel.ReadUncommitted); ... f2(); ... t.Commit(); } f2() { Connection2.Execute("SELECT..."); } 调用f2()会导致超时异常 这种行为令我惊讶,因为我认为IsolationLeve

嗨,当调用代码有一个挂起的事务时,我在从数据库读取时遇到了一个问题。像这样:

f1() {
DbTransaction t = Connection1.BeginTransaction(IsolationLevel.ReadUncommitted);
  ...
  f2();
  ...
  t.Commit();
}

f2() {
  Connection2.Execute("SELECT...");
}
调用f2()会导致超时异常

这种行为令我惊讶,因为我认为
IsolationLevel
将允许对数据库进行读取访问。当我从
f1()
中删除事务时,问题就消失了

我非常感谢大家对这个问题以及如何解决这个问题的评论。我想保留这笔交易


(Visual Studio 2010、C#、.NET 4.0、SQL Server 2008兼容级别80)

我不确定您为什么要在f2()中打开另一个连接实例,因为看起来这两个连接都指向同一个DB和DB服务器。您只需将Connection1实例从f1()传递到f2()方法调用并重用即可

f1()
{
    ...

    f2(Connection1);

    ...
}

f2()
{
    Connection1.Execute(SELECT...);
}

正如@Vijay所说,您似乎不需要在此处创建第二个连接,因此使用相同的连接可以轻松解决此问题

不过,为了解释第二个连接阻塞的原因,请参考:

您的第一个连接正在隔离级别
READ UNCOMMITTED
下运行,这仍然可以创建独占锁。在创建
Connection1
和调用
f2()
之间的某个点上,您可以创建一个独占锁,该锁阻止
f2()
执行的语句,该语句在默认隔离级别
读取提交的
下运行

如果要查看锁的情况,请打开两个SSMS窗口。在第一个窗口中,运行以下语句:

set transaction isolation level read uncommitted
go

begin transaction 
-- alter some data
delete MyTable
waitfor delay '00:00:15'

rollback transaction

在第二个窗口中,运行
sp_lock
查看
MyTable
上的锁

我建议您在using语句中使用TransactionScope来启动这些事务。除此之外,按照Vijay的建议重用连接

我相信您遇到的问题与从第一个连接继承环境事务的同一数据库的第二个连接有关。我不确定数据库提供程序是否支持同一连接中同一数据库服务器的多个连接


当第二次选择被阻塞时,您总是可以打开SQLStudio并检查活动锁的列表。很容易找到到底是什么阻塞。

您已经告诉connection1读取未提交的数据。你还没有告诉connection2。