|
|
需求:有些数据允许脏读,例如:文章内容、阅读量、评论等信息,他不像金融类的数据那么严谨。为了提升查询性能,可能是使用 ReadUncommitted 事务,但是 SqlTransaction 和 TransactionScope 存在泄漏隔离级别的 BUG,至今未修复,所以,考虑使用 WITH(NOLOCK) 方案。
回顾:
SqlTransaction 和 TransactionScope 泄漏隔离级别(该 BUG 已经存在 8 年,至今未修复!我估计很多人可能会受到影响,但却没有意识到这一点):超链接登录可见。
本文需要引用 SqlScriptDOM 来解析 SQL 语句并添加 WITH(NOLOCK),参考开源项目:超链接登录可见。
Nuget 引用如下:
新建 AllowDirtyReadAttribute.cs 特性,代码如下:
新建 WithNoLockInterceptor 来重写 DbCommandInterceptor 中的某些方法,代码如下:
注入到 EF Core 中,配置如下:
使用,在控制器方法上面添加 [AllowDirtyRead] 即可。
原始 SQL 语句:
SELECT [o].[Id],
[o].[CustomerName],
[o0].[Id],
[o0].[OrderId],
[o0].[Product]
FROM [Orders] AS [o]
LEFT OUTER JOIN
[OrderLines] AS [o0]
ON [o].[Id] = [o0].[OrderId]
WHERE [o].[Id] = 1
ORDER BY [o].[Id]; 添加 NOLOCK 后生成的语句:
SELECT [o].[Id],
[o].[CustomerName],
[o0].[Id],
[o0].[OrderId],
[o0].[Product]
FROM [Orders] AS [o] WITH (NOLOCK)
LEFT OUTER JOIN
[OrderLines] AS [o0] WITH (NOLOCK)
ON [o].[Id] = [o0].[OrderId]
WHERE [o].[Id] = 1
ORDER BY [o].[Id]; |
上一篇:(MSSQL)SQL Server Full-Text 全文搜索、全文索引
|