• dotnetcore EF 乐观锁并发控制


    使用IsConcurrencyToken()设置并发token

      builder.Property(h => h.Owner).IsConcurrencyToken();
    

    使用SQL语句类似以下

      update house set owner = @p0
      where id = 1 and owner = @p1
    
      -- 通过引用旧的owner值来更新,如果owner值已改变,则更新失败,发出DbUpdateConcurrencyException。
    

    捕获DbUpdateConcurrencyException,获取新Token的值。

      catch (DbUpdateConcurrencyException ex)
      {
          var entry = ex.Entries.First();
          var dbValues = await entry.GetDatabaseValuesAsync();
          string newOwner = dbValues.GetValue<string>(nameOf(House.Owner));
          Console.WriteLine($"concurrency error, {newOwner} is owner now");
      }
    

    使用RowVersion控制并发

    1. 增加RowVer属性
      public byte[] RowVer { get; set; }
    
    1. 设置RowVersion
      builder.Property(c => c.RowVer).IsRowVersion();
    

    原理和上面一样,只是改为判断RowVersion。
    3. 测试代码和上例一样,也通过捕获DbUpdateConcurrencyException,取得owner的新值。

    注意

    方案1,会有ABA的问题,即值发生过改变,但又改回来了,这样就需要考虑RowVersion是不是更合适了。

  • 相关阅读:
    java 分解质因数
    Unix 文件系统读写时权限校验
    find 命令实战巧用
    Linq分组功能
    三种查看SqlServer中数据物理pge页的方法
    一个高度压缩的bit位图字典的实现
    windbg 命令 gchandles
    ManualResetEvent和AutoResetEvent的区别实例
    一些汇编指令(基于8086)
    windbg sos版本不匹配问题解决
  • 原文地址:https://www.cnblogs.com/mryux/p/15861875.html
Copyright © 2020-2023  润新知