Sql server 使用LINQ中的TransactionScope将隔离级别更改为SQL for NOLOCK会影响连接吗?

Sql server 使用LINQ中的TransactionScope将隔离级别更改为SQL for NOLOCK会影响连接吗?,sql-server,linq-to-sql,transactions,isolation-level,transaction-isolation,Sql Server,Linq To Sql,Transactions,Isolation Level,Transaction Isolation,我正在测试使用TransactionScope with选项将隔离级别设置为ReadUncommitted以执行特定的查询。然而,我看到的是,因为隔离级别是在连接上设置的,当连接被用于其他查询时,隔离级别仍然是ReadUncommitted,而不是重置为默认的ReadCommitted 根据许多建议,我将新的NoLock方法抽象为如下扩展: public static class QueryableExtensions { static TransactionScope CreateNo

我正在测试使用TransactionScope with选项将隔离级别设置为ReadUncommitted以执行特定的查询。然而,我看到的是,因为隔离级别是在连接上设置的,当连接被用于其他查询时,隔离级别仍然是ReadUncommitted,而不是重置为默认的ReadCommitted

根据许多建议,我将新的NoLock方法抽象为如下扩展:

public static class QueryableExtensions
{
    static TransactionScope CreateNoLockTransaction()
    {
        return new TransactionScope(TransactionScopeOption.Required, new TransactionOptions
        {
            IsolationLevel = IsolationLevel.ReadUncommitted
        });
    }

    public static T[] ToNoLockArray<T>(this IEnumerable<T> query)
    {
        using (var ts = CreateNoLockTransaction())
        {
            return query.ToArray();
        }
    }

    public static List<T> ToNoLockList<T>(this IEnumerable<T> query)
    {
        using (var ts = CreateNoLockTransaction())
        {
            return query.ToList();
        }
    }

    public static int NoLockCount<T>(this IEnumerable<T> query)
    {
        using (var ts = CreateNoLockTransaction())
        {
            return query.Count();
        }
    }
}
公共静态类QueryableExtensions
{
静态事务处理范围CreateNoLockTransaction()
{
返回新TransactionScope(TransactionScopeOption.Required,new TransactionOptions
{
IsolationLevel=IsolationLevel.ReadUncommitted
});
}
公共静态T[]ToNoLockArray(此IEnumerable查询)
{
使用(var ts=CreateNoLockTransaction())
{
返回query.ToArray();
}
}
公共静态列表ToNoLockList(此IEnumerable查询)
{
使用(var ts=CreateNoLockTransaction())
{
返回query.ToList();
}
}
公共静态int NoLockCount(此IEnumerable查询)
{
使用(var ts=CreateNoLockTransaction())
{
返回query.Count();
}
}
}
然后,我想验证在事务范围内和不在事务范围内运行的各种查询的隔离级别。为此,我开始使用查询的上下文执行以下查询:

db.ExecuteQuery<int>("select cast(transaction_isolation_level as int) from sys.dm_exec_sessions where session_id = @@SPID").FirstOrDefault();
db.ExecuteQuery(“从sys.dm_exec_会话中选择cast(事务隔离级别为int),其中会话id=@@SPID”).FirstOrDefault();
在执行NoLock扩展方法之前运行上述命令,将隔离级别返回为2。运行NoLock扩展方法并检查事务范围外查询的隔离级别后,返回1


这是否意味着,当使用TransactionScope更改隔离级别时,受影响的连接在重新用于其他查询和数据上下文时,将继续使用ReadUncommitted隔离级别?使用事务临时更改特定查询的隔离级别的目的是否会失败,因为它会影响以后的所有查询?

您需要使用

ts.Complete()

在查询之后和返回之前,我们遇到了与此完全相同的问题。我们使用LINQ to SQL,并且使用TransactionScope对象会导致整个SQL spid的读取不受限制

这是我所能找到的唯一方法,仅对当前查询执行“未限制读取”:

dbContext.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");

var Data = query.ToList();

dbContext.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
这显然不是一个很好的方法,因为在sql过程中执行的其他查询可能会在几毫秒内受到影响,这是打开的,它会生成对DB服务的两个额外调用


如果有一种方法可以让LINQ在select语句中生成事务隔离级别,那会好得多。

非主题-我相信您知道,
readuncommitted
可以返回脏读。这些记录可能包括技术上不属于数据库的记录。有关更多信息,请参见。这正是我只想执行某些查询的原因,我对使用READ UNCOMMITTED隔离级别处理脏读没有意见。问题是如何在LINQ to SQL中实现这一点,甚至可能EF也会影响其他查询,这不是期望的行为。这必须与位于两者之间的连接池中的实际连接有关。