<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      給 EF Core 查詢增加 With NoLock

      給 EF Core 查詢增加 With NoLock

      Intro

      EF Core 在 3.x 版本中增加了 Interceptor,使得我們可以在發生低級別數據庫操作時作為 EF Core 正常運行的一部分自動調用它們。 例如,打開連接、提交事務或執行命令時。

      所以我們可以自定義一個 Interceptor 來記錄執行的 sql 語句,也可以通過 Interceptor 來實現 sql 語句的執行前的修改或者更準確的記錄 DbCommand 執行的耗時。

      這里我們可以借助 Interceptor 實現對于查詢語句的修改,自動給查詢語句加 (WITH NOLOCK)WITH NOLOCK 等效于 READ UNCOMMITED(讀未提交)的事務級別,這樣可能會造成一定的臟讀,但是從效率上而言,是比較高效的,不會因為別的事務長時間未提交導致查詢阻塞,所以對于大數據多事務的場景下,查詢 SQL 加 NOLOCK 還是比較有意義的

      NoLockInterceptor

      繼承 DbCommandInterceptor,重寫查詢 sql 執行之前的操作,在執行查詢 sql 之前增加 WITH(NOLOCK),實現代碼如下:

      public class QueryWithNoLockDbCommandInterceptor : DbCommandInterceptor
      {
          private static readonly Regex TableAliasRegex =
              new Regex(@"(?<tableAlias>AS \[[a-zA-Z]\w*\](?! WITH \(NOLOCK\)))",
                  RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
      
          public override InterceptionResult<object> ScalarExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<object> result)
          {
              command.CommandText = TableAliasRegex.Replace(
                  command.CommandText,
                  "${tableAlias} WITH (NOLOCK)"
                  );
              return base.ScalarExecuting(command, eventData, result);
          }
      
          public override Task<InterceptionResult<object>> ScalarExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<object> result,
              CancellationToken cancellationToken = new CancellationToken())
          {
              command.CommandText = TableAliasRegex.Replace(
                  command.CommandText,
                  "${tableAlias} WITH (NOLOCK)"
                  );
              return base.ScalarExecutingAsync(command, eventData, result, cancellationToken);
          }
      
          public override InterceptionResult<DbDataReader> ReaderExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result)
          {
              command.CommandText = TableAliasRegex.Replace(
                  command.CommandText,
                  "${tableAlias} WITH (NOLOCK)"
                  );
              return result;
          }
      
          public override Task<InterceptionResult<DbDataReader>> ReaderExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result,
              CancellationToken cancellationToken = new CancellationToken())
          {
              command.CommandText = TableAliasRegex.Replace(
                  command.CommandText,
                  "${tableAlias} WITH (NOLOCK)"
                  );
              return base.ReaderExecutingAsync(command, eventData, result, cancellationToken);
          }
      }
      

      Interceptor 的使用

      在注冊 DbContext 服務的時候,可以配置 Interceptor,配置如下:

      var services = new ServiceCollection();
      services.AddDbContext<TestDbContext>(options =>
      {
          options
              .UseLoggerFactory(loggerFactory)
              .UseSqlServer(DbConnectionString)
              .AddInterceptors(new QueryWithNoLockDbCommandInterceptor())
              ;
      });
      

      使用效果

      通過 loggerFactory 記錄的日志查看查詢執行的 sql 語句

      可以看到查詢語句自動加上了 WITH (NOLOCK)

      Reference

      posted @ 2020-04-02 23:51  WeihanLi  閱讀(7027)  評論(39)    收藏  舉報
      主站蜘蛛池模板: 精品人妻免费看一区二区三区| 国产成人午夜精品福利| 国产性三级高清在线观看| AV人摸人人人澡人人超碰| 97欧美精品系列一区二区| 亚洲国产成人久久综合区| 精品 无码 国产观看| 色综合久久天天综线观看| 亚洲男人AV天堂午夜在| 无码日韩精品一区二区三区免费| 成人午夜无人区一区二区| 青草99在线免费观看| 亚洲av成人无网码天堂| 中文字幕精品人妻丝袜| 日本高清视频网站www| 亚洲成人午夜排名成人午夜| 亚洲日本乱码在线观看| 夜色资源站www国产在线视频 | 日本美女性亚洲精品黄色| 综合偷自拍亚洲乱中文字幕| 人妻系列无码专区69影院| 日韩狼人精品在线观看| 极品美女aⅴ在线观看| 国产女人在线视频| 青青青爽在线视频观看| 起碰免费公开97在线视频| 九九色这里只有精品国产| 国产乱人偷精品人妻a片| 日本久久99成人网站| 正在播放国产剧情亂倫| 亚洲一区中文字幕人妻| 中文字幕人妻av第一区| 无码人妻精品一区二区三区免费| 国产激情无码一区二区三区| 久久99日韩国产精品久久99| 欧美人妻一区二区三区| 国产高潮刺激叫喊视频| 视频一区二区不中文字幕| 亚洲精品国产免费av| 罗甸县| 国产精品毛片一区视频播|