sql-server - 在 LINQ to SQL for NOLOCK 中使用 TransactionScope 更改隔离级别是否会影响连接?

标签 sql-server linq-to-sql transactions isolation-level transaction-isolation

我正在测试使用 TransactionScope 和选项将隔离级别设置为 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();
        }
    }
}

然后我想验证我在事务范围内和不在事务范围内运行的各种查询的隔离级别。为此,我开始使用查询的上下文执行以下查询:
db.ExecuteQuery<int>("select cast(transaction_isolation_level as int) from sys.dm_exec_sessions where session_id = @@SPID").FirstOrDefault();

在执行 NoLock 扩展方法之前运行上面的代码返回隔离级别为 2。在运行 NoLock 扩展方法并检查事务范围外查询的隔离级别后,返回 1。

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

最佳答案

您需要使用关闭范围

ts.Complete()

在查询之后和返回之前

关于sql-server - 在 LINQ to SQL for NOLOCK 中使用 TransactionScope 更改隔离级别是否会影响连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36158358/

相关文章:

arrays - 在 SQL Server 中将一列拆分为多列

sql-server - SSIS 作业无法访问 Azure 文件共享路径

SQL Case 语句返回重复行的索引

sql-server - 用于检查/挖掘 SQL 分析服务挖掘模型的前端应用程序

c# - ADO.NET 包含哪些技术?

c# - 查询嵌套递归对象的性能问题

spring - 多(Tomcat + ActiveMQ + Mysql)事务管理

c# - MassTransit 事务性发布

java - Hibernate 模板关闭事务

c# - 对象在 3 层模型中的何处合并/加入数据?