【问题标题】:How to solve Optimistic Concurrency Updates in c# .NET N-tier applications?如何解决 c# .NET N 层应用程序中的乐观并发更新?
【发布时间】:2010-10-12 11:48:41
【问题描述】:

大家好。

在 c# .net VS 2008 中,我正在开发一个 N 层 CRM 框架解决方案,完成后我想分享它。

架构基于:

数据访问层、实体框架、业务逻辑层、WCF,最后是表示层(win forms)。

在某处我读到,超过 2 层是有问题的,因为乐观并发更新(具有相同数据的多个客户端事务)。

最大。 2 层解决方案这应该不是问题,因为控件(如 datagridview)自己解决了这个问题,所以我问自己使用 2 层是否更好,从而避免乐观并发有问题吗?

实际上,我想为大型项目制作 N 层解决方案,而不是 2 层。我不知道如何解决这样的并发问题,希望在这里得到帮助。

当然应该有一些很好的机制来解决这个问题...也许有任何建议、示例等?

谢谢你的期待。

最好的问候, 周杰

【问题讨论】:

    标签: c# .net entity-framework n-tier-architecture optimistic-concurrency


    【解决方案1】:

    这不是层数的问题。问题是您的数据访问逻辑如何处理并发性。无论您有多少层,都应该在处理您的数据访问的任何层中处理并发。但我了解您的来源,因为 .NET 控件和组件可以隐藏此功能并减少所需的层数。

    有两种常见的乐观并发解决方法。

    第一个是在行上使用时间戳来确定用户在开始编辑时正在查看的版本在他们提交编辑时是否已被修改。请记住,这不一定是正确的 Timestamp 数据库数据类型。不同的系统将使用不同的数据类型,每种数据类型都有自己的优点和缺点。这是一种更简单的方法,适用于大多数设计良好的数据库。

    第二种常见的方法是,在提交更改时,不仅通过 id 还通过用户更改的字段的所有原始值来识别有问题的行。如果字段和 id 的原始值与正在编辑的记录不匹配,则您知道这些字段中至少有一个已被其他用户更改。此选项的好处是,即使两个用户编辑相同的记录,只要他们不更改相同的字段,提交也可以工作。缺点是可能需要额外的工作来保证数据库记录中的数据在业务规则方面处于一致状态。

    Here's 很好地解释了如何在 EF 中实现简单的乐观并发。

    【讨论】:

      【解决方案2】:

      我们使用组合手动合并(确定更改集和冲突),最后一个人获胜,具体取决于数据要求。如果数据更改与从公共原始值更改的相同字段发生冲突,则会引发合并类型异常并由客户端处理。

      【讨论】:

        【解决方案3】:

        我想到了一些事情:

        1) 如果您使用的是 EF,那么您肯定没有数据访问层吗?!你是说数据库本身吗?

        2) 分层问题既是物理问题又是逻辑问题。那么你的意思是物理的还是逻辑的?

        3) 在任何分层的应用程序中都存在这个并发问题。即使在客户端-服务器中,人们也可以打开一个表单,去某个地方,然后在其他地方更改数据时返回,然后保存。您可以在保存时使用时间戳进行检查,以确保您上次更新是在您拥有数据时。

        4) 不要在更少或更多层上考虑太多。只需尽可能简单地实现功能并使用最少的层数即可。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-11
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多