Sql Server 有一个 With (NOLOCK) 关键字,要在EF Core中实现,有一个注入的方法

https://www.cnblogs.com/weihanli/p/12623934.html


但有一个更加方便的方法,效果差不多,如下所示

using (var scope = new TransactionScope(TransactionScopeOption.Required,
    new TransactionOptions()
    {
        IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
    }))
{
    model = new GetCountModel
    {
        CountForHasNewMessage = query.Where(x => x.WorkTask.MessageCount > x.MessageCountForIsRead).Count(),
        CountForDoing = query.Where(x => x.WorkTask.Status == WorkTaskStatus.待处理).Count(),
        CountForPlanEndTimeIsExpire = query.Where(m => m.WorkTask.Status == WorkTaskStatus.待处理 && m.WorkTask.PlanEndTime.HasValue && DateTime.Now > m.WorkTask.PlanEndTime).Count(),
        CountForPlanEndTime2DaysExpire = query.Where(m => m.WorkTask.Status == WorkTaskStatus.待处理 && m.WorkTask.PlanEndTime.HasValue && m.WorkTask.PlanEndTime >= DateTime.Now && m.WorkTask.PlanEndTime < twoDayEnd).Count()
    };
    scope.Complete();
}
public enum IsolationLevel
Chaos5无法覆盖隔离级别更高的事务中的挂起的更改。
ReadCommitted2不可以在事务期间读取可变数据,但是可以修改。
ReadUncommitted3可以在事务期间读取和修改可变数据。
RepeatableRead1可以在事务期间读取可变数据,但是不可以修改。 可以在事务期间添加新数据。
Serializable0可以在事务期间读取可变数据,但是不可以修改,也不可以添加任何新数据。
Snapshot4可以读取可变数据。 在事务修改数据之前,它会验证在它最初读取数据之后另一个事务是否更改过这些数据。 如果数据已更新,则会引发错误。 这样,事务可获取先前提交的数据值。当尝试提升已创建的 Snapshot 隔离级别的事务时,将引发 InvalidOperationException,并显示错误消息“无法提升快照隔离级别的事务”。
Unspecified6正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。 如果设置了此值,则会引发异常。


一个可用的方法

public static void NoLockInvokeDB(Action action)
{
    var transactionOptions = new System.Transactions.TransactionOptions();
    transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
    using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions))
    {
        try
        {
            action();
        }
        finally
        {
            transactionScope.Complete();
        }
    }
}
NoLockInvokeDB(() =>
{
   using (var db = new TicketDB())
   {
      lst = db.User.ToList();
   }
});

参考

https://stackoverflow.com/questions/926656/entity-framework-with-nolock

https://blog.csdn.net/dyllove98/article/details/9280501

https://learn.microsoft.com/zh-cn/dotnet/api/system.transactions.isolationlevel?view=net-8.0