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

时间:2009-09-22 08:46:47

标签: c# concurrency

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

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

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

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

欢迎任何想法,评论或信息......

此致 Sven Peeters

2 个答案:

答案 0 :(得分:2)

乐观锁定的最常见实现是除主键外还在每个表中都有一个Version列(通常是TIMESTAMP)。

当你从表中加载数据时,你必须在内存中加载Version并且永远不会改变它(通常它只是一个不透明的字节数组)。

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

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

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

答案 1 :(得分:0)

锁定问题对我来说仍然不明确。 我发现.Net标准解决方案不是用户友好的(保存之前的冲突管理)。 在许多情况下,用户将丢失他应用于记录的更改。

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

此致 Sven Peeters