C# .Net应用程序中并发问题的最佳实践

C# .Net应用程序中并发问题的最佳实践,c#,concurrency,C#,Concurrency,我们计划将现有的VB6应用程序升级到C#(VS2008)。 在访问数据时,ADO.Net遵循更多的断开连接策略。 我正在考虑尝试一下实体框架,因为如果你想加快开发速度,强烈建议使用ORM工具。 EF使用乐观锁定 例如,当两个用户打开同一个“客户”时,您如何解决这个古老的问题。 ADO.net建议在使用冲突异常保存记录时检查记录是否已更改 在旧的VB6应用程序中,我们曾经有两个系统: -在记录上保留一个名为“Locked”的位和一个名为“LockedBy”的文本字段 这很容易实现和使用,但当应用程

我们计划将现有的VB6应用程序升级到C#(VS2008)。 在访问数据时,ADO.Net遵循更多的断开连接策略。 我正在考虑尝试一下实体框架,因为如果你想加快开发速度,强烈建议使用ORM工具。 EF使用乐观锁定

例如,当两个用户打开同一个“客户”时,您如何解决这个古老的问题。 ADO.net建议在使用冲突异常保存记录时检查记录是否已更改

在旧的VB6应用程序中,我们曾经有两个系统: -在记录上保留一个名为“Locked”的位和一个名为“LockedBy”的文本字段 这很容易实现和使用,但当应用程序崩溃或网络连接出现问题时,此记录仍将被锁定。 -因为我们只使用MSSQL作为数据库,所以我们一直在为那些拥有SQL 2000或更高版本的客户使用MSSQL的行级别锁定功能

在现代的.Net应用程序中如何处理这个问题,您如何解决.Net应用程序中这个古老的问题

欢迎任何想法、评论或信息

问候,,
Sven Peeters

乐观锁定最常见的实现是在每个表中除了主键之外还有一个版本列(通常是时间戳)

当您从表中加载数据时,必须在内存中加载版本,并且永远不要更改它(通常它只是一个不透明的字节数组)

保存更新后的表时,启动一个非常短暂的事务,首先读取Version列的当前值,并将其与内存中的值进行比较

  • 如果它们相等,则意味着没有其他人修改数据,您可以安全地保存数据
  • 如果它们不同,则意味着在读取数据后其他人修改了数据,您必须解决该冲突

AFAIR,实体Framwork支持这种开箱即用的乐观锁定。

我仍然不清楚锁定问题。 我发现.Net标准解决方案对用户不友好(保存前的冲突管理)。 在许多情况下,用户会丢失对记录所做的更改

我们现在正在玩NHibernate和手动锁定的记录。 通过创建名为TableName.PrimaryKeyValue的全局临时表。 保存操作后,表将被删除;如果关闭连接,表将被删除;如果应用程序意外停止,SQL Server将在我之后进行清理。 我们正在将此手动锁定集成到对象本身和对象存储库中

问候,,
Sven Peeters

我们使用类似的机制,但没有EF@Juri:是的,这是一个非常常见的实现:)