【问题标题】:How to handle concurrency control in ASP.NET Dynamic Data?如何处理 ASP.NET 动态数据中的并发控制?
【发布时间】:2010-06-01 23:15:36
【问题描述】:

动态数据给我留下了深刻的印象,而且让一个简单的网站启动和运行是多么容易和快速。我打算将它用于一个简单的内部人力资源管理网站,用于注册人们的技能/学位/等。

我一直在 www.asp.net/dynamicdata 上观看介绍视频,他们从未提及的一件事是如何处理并发控制。

由于我手动生成了更改冲突异常并且应用程序失败且没有任何用户友好的消息,因此 DD 似乎没有立即处理它(除非有一些我没有看到的设置)。

有人知道 DD 是否开箱即用地处理它?还是您必须以某种方式将其构建到网站中?

【问题讨论】:

    标签: asp.net dynamic-data


    【解决方案1】:

    DD 不会开箱即用地处理并发。

    【讨论】:

      【解决方案2】:

      一种方法是在数据库端实现这一点,方法是向每个表添加“最后更新”时间戳列(或其他唯一标记,例如 GUID)。

      然后为每个表创建一个更新触发器。对于正在更新的每一行,传递的“最后更新”标记是否与数据库中行上的标记相同? 如果是这样,请更新该行,但给它一个新的“最后更新”标记。 如果不是,请引发特定的“数据已过期”异常。

      在客户端,对于您更新的每一行,您都需要刷新“最后更新”标记。

      在客户端代码中,您观察“数据已过期”异常并向用户显示有用的消息,要求他们刷新数据并重新提交更改。

      希望这会有所帮助。

      【讨论】:

      • 感谢您的回答二进制。如何在 DD 的客户端代码中捕获“数据已过期”异常?
      • 老实说我没有任何线索,我“假设”异常通过层冒泡。编写一个引发异常的触发器,看看会发生什么。
      • 是的,异常会冒泡,然后通过消息框显示给用户,这一切都是非用户友好的荣耀。我不确定如何处理它到达那里的异常并向用户显示更好的消息。
      • 愚蠢的问题,但是您是否尝试在更新调用周围放置try{}catch{} 块?你能捕捉到那里的异常吗?还是在应用程序级别添加一个通用事件处理程序?
      • 一点也不笨!在动态数据中,所有数据库 CRUD 查询都是为您创建的。您创建模型,DD 会自动生成网页以列出、查看、创建和修改每个表中的记录。因此,我什至不必编写更新调用。
      【解决方案3】:

      一切都取决于定义,“开箱即用”是什么意思。当然,您必须创建大量代码来处理并发,但一些功能可以帮助我们实现它。

      我最喜欢的模型是基于 SQL Server rowversion 数据类型的“乐观并发”。它类似于“上次更新”时间戳,但您无需为每个表使用任何更新触发器。每次更新表行中的数据时,SQL 服务器都会自动对表中相应的“时间戳”列进行所有更新。我在旧答案Concurrency handling of Sql transactrion 中对此进行了描述。希望对您有所帮助。

      【讨论】:

        【解决方案4】:

        我的印象是动态数据会更新基础数据源。也许您可以在 App_Init 部分注册的数据元模型上指定并发模型(悲观/乐观)。但是你可能会遇到无法保存更改的错误,所以默认情况下会很悲观,最后输了....

        【讨论】:

        • 它是 ASP.Net Yello 死屏吗?也许您可以在 global.asax 错误部分中发现错误。您能否在问题中发布错误
        【解决方案5】:

        抱歉重播晚了。是的,在项目的快速开发方面,DD太强大了。它不仅是 .Net 4.0 的基础。 DD 更加增强并已包含在 .Net 4.0 中。

        DD 主要在 Linq to sql 上工作。我会建议你看看那部分。

        在 linq to SQl 中,当您转到表的属性时,您会在那里找到一个属性,该属性指定wheater 在更新新值之前检查旧值。如果你设置为真,我认为你的问题会得到处理。

        祝你好运。

        让我们互相学习。

        【讨论】:

          【解决方案6】:

          Binary Worrier 提供的解决方案有效,并且广泛用于提供 GUI 以合并更改的平台(例如源代码控制程序、wiki 引擎等)。这样,任何用户都不会丢失他们的更改。另一方面,它需要大量代码或使用外部组件或 DLL。

          如果您对此不满意,另一种方法是锁定正在编辑的记录。在用户提交更改或他的会话到期之前,其他人将无法编辑该记录。它有利有弊,但与第一个选项相比,它需要的代码很少。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多