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

Huz*_*pal 5 sql-server transactions transaction-isolation isolation-level linq-to-sql

我正在测试使用 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我想验证我在事务范围内和不在事务范围内运行的各种查询的隔离级别。为此,我开始使用查询的上下文执行以下查询:

db.ExecuteQuery<int>("select cast(transaction_isolation_level as int) from sys.dm_exec_sessions where session_id = @@SPID").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

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

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

Cal*_*582 0

你需要使用关闭范围

ts.Complete()
Run Code Online (Sandbox Code Playgroud)

查询之后、返回之前