【问题标题】:Best practice to lock a record for editing while using entity framework使用实体框架时锁定记录以进行编辑的最佳实践
【发布时间】:2016-08-10 01:07:31
【问题描述】:

不太清楚这个问题应该怎么表达,但是就这样吧。我正在开发一个项目,其中多个客户端应用程序通过 WCF 服务访问一个数据源。它可能不相关,但 WCF 服务正在利用实体框架来访问此数据源。每当客户查询要编辑的记录时,我想阻止其他客户编辑同一条记录,直到第一个客户完成更新。

如果我错了,请纠正我,但我相信这也称为同步和异步数据访问。

我的问题是,实现此功能的行业最佳实践是什么。有没有办法从数据库端(使用 SQL)控制它,还是必须通过客户端完成?

我考虑为每个表添加一个布尔值“EditMode”列,并在编辑时将其设置为 true,并在允许其他客户端访问该记录之前检查是否设置为 true。

【问题讨论】:

    标签: sql entity-framework


    【解决方案1】:

    最佳做法是使用 RowVersion 和乐观锁定。

    Optimistic Concurrency Patterns 解释。

    如果首先使用代码,则在您的 POCO 中包含一个字段。

    public virtual byte[] RowVersion { get; set; }
    

    EF 会将 Timestamp/RowVersion 属性添加到您的表中。它将在更新期间进行检查。并在更改时由数据库自动更新。

    编辑:为了更好地解释。

    EF 寻找的是并发字段的属性,因此您可以实际控制一个或多个字段的并发。

    entity.Property(p => p.RowVersion).IsConcurrencyToken()
    

    在执行更新或删除时,您会捕获定义的异常

    catch (DbUpdateConcurrencyException ex)
    

    EF 将 RowVersion 视为并发标记。这是常用的方法。由于 SQLServer 会自动为您更新此字段类型。 所以非常快速和容易。但是你可以明确告诉 EF 一个属性是一个并发令牌并且有多个。

    所以 EF 应该在 where 子句中添加属性以进行更新和删除 以确保记录自访问后没有更改。

    【讨论】:

    • 谢谢,这似乎正是我所需要的。我只是不确定它叫什么,以便自己进行研究。
    • @phil soday - 如果您首先使用代码并将该行放入您的域中,它是否会自动知道要执行 RowVersion 锁定?它必须称为 RowVersion 吗?它会抛出异常还是如何工作?
    • 这似乎也是我需要的,但是我没有先使用代码。我仍在使用 EF5 edmx 是他们实现 tiis 的一种方式,如果用户 b 在用户 a 保存之前进行更改会发生什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多