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

我正在测试使用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中的TransactionScope更改隔离级别是否会影响连接? - 代码日志