我们计划将现有的VB6应用程序升级到C#(VS2008)。 访问数据时,ADO.Net遵循更多断开连接的策略。 我正在考虑给实体框架一个机会,因为如果你想加速开发,强烈建议使用ORM工具。 EF使用乐观锁定。
当2个用户打开同一个“客户”时,如何解决这个古老的问题。 ADO.net建议在使用冲突例外保存记录时检查记录是否已更改。
在旧的VB6应用程序中,我们曾经有两个系统: - 在记录上保留一个名为“Locked”的文本字段和一个名为“LockedBy”的文本字段 这很容易实现和使用,但是当应用程序崩溃或网络连接出现问题时,该记录仍将被锁定。 - 由于我们只使用MSSQL作为数据库,因此我们一直在为那些拥有SQL 2000或更高版本的客户使用MSSQL的行级锁定功能。
如何在现代.Net应用程序中处理这个问题,如何在.Net应用程序中解决这个古老的问题?
欢迎任何想法,评论或信息......
此致 Sven Peeters
答案 0 :(得分:2)
乐观锁定的最常见实现是除主键外还在每个表中都有一个Version列(通常是TIMESTAMP)。
当你从表中加载数据时,你必须在内存中加载Version并且永远不会改变它(通常它只是一个不透明的字节数组)。
保存更新的表时,启动一个非常短暂的事务,首先读取Version列的当前值,并将其与内存中的值进行比较。
AFAIR,Entity Framwork支持开箱即用的这种乐观锁定。
答案 1 :(得分:0)
锁定问题对我来说仍然不明确。 我发现.Net标准解决方案不是用户友好的(保存之前的冲突管理)。 在许多情况下,用户将丢失他应用于记录的更改。
我们现在正在使用NHibernate和手动锁定记录。 通过创建名为TableName.PrimaryKeyValue的全局临时表。 在保存操作之后,表将被删除,如果关闭连接,表将被删除,如果应用程序无意中停止,SQL Server将在我之后进行清理。 我们正在将这种手动锁定集成到对象本身和对象存储库中。
此致 Sven Peeters