加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 在使用实体框架时锁定记录以进行编辑的最佳实践

发布时间:2021-01-18 07:48:50 所属栏目:MsSql教程 来源:网络整理
导读:不太确定如何说出这个问题,但在这里.我正在开发一个项目,其中多个客户端应用程序通过WCF服务访问一个数据源.它可能不相关,但WCF服务正在利用实体框架来访问此数据源.每当客户端查询记录进行编辑时,我想阻止其他客户端编辑同一记录,直到第一个客户端完成更

不太确定如何说出这个问题,但在这里.我正在开发一个项目,其中多个客户端应用程序通过WCF服务访问一个数据源.它可能不相关,但WCF服务正在利用实体框架来访问此数据源.每当客户端查询记录进行编辑时,我想阻止其他客户端编辑同一记录,直到第一个客户端完成更新.

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

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

我考虑过为每个表包含一个布尔“EditMode”列,并在编辑时简单地将其设置为true,并在允许其他客户端访问该记录之前检查是否设置为true.

解决方法

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

Optimistic Concurrency Patterns解释.

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

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

EF将为您的表添加Timestamp / RowVersion属性.它将在更新期间进行检查.并在更改时由DB自动更新.

编辑:更好地解释.

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

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

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

catch (DbUpdateConcurrencyException ex)

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

因此,EF应该为where子句添加属性以进行更新和删除确保记录自访问后没有变化.

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读