Dotnet
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
Chaos | 5 | 无法覆盖隔离级别更高的事务中的挂起的更改。 |
ReadCommitted | 2 | 不可以在事务期间读取可变数据,但是可以修改。 |
ReadUncommitted | 3 | 可以在事务期间读取和修改可变数据。 |
RepeatableRead | 1 | 可以在事务期间读取可变数据,但是不可以修改。 可以在事务期间添加新数据。 |
Serializable | 0 | 可以在事务期间读取可变数据,但是不可以修改,也不可以添加任何新数据。 |
Snapshot | 4 | 可以读取可变数据。 在事务修改数据之前,它会验证在它最初读取数据之后另一个事务是否更改过这些数据。 如果数据已更新,则会引发错误。 这样,事务可获取先前提交的数据值。当尝试提升已创建的 Snapshot 隔离级别的事务时,将引发 InvalidOperationException,并显示错误消息“无法提升快照隔离级别的事务”。 |
Unspecified | 6 | 正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。 如果设置了此值,则会引发异常。 |
一个可用的方法
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