.net 向应用程序层传递并发冲突

.net 向应用程序层传递并发冲突,.net,concurrency,data-access-layer,command-query-separation,.net,Concurrency,Data Access Layer,Command Query Separation,在将并发冲突传递给应用程序层时,是否有其他方法可以替代使用异常,同时也尊重异常的原则,或者异常是我们拥有的最佳机制(在支持异常的语言中) 在我的应用程序内部,我有乐观的锁定逻辑,当我调用某些高级方法时,它会向下执行几层,例如(在我的例子中,我使用的是一个自定义数据访问层,不过我当然愿意听ORM实现是如何做到这一点的)。应用程序与之交互的高级方法调用如下所示: // 'data' is just a placeholder for multiple parameters, including so

在将并发冲突传递给应用程序层时,是否有其他方法可以替代使用异常,同时也尊重异常的原则,或者异常是我们拥有的最佳机制(在支持异常的语言中)

在我的应用程序内部,我有乐观的锁定逻辑,当我调用某些高级方法时,它会向下执行几层,例如(在我的例子中,我使用的是一个自定义数据访问层,不过我当然愿意听ORM实现是如何做到这一点的)。应用程序与之交互的高级方法调用如下所示:

// 'data' is just a placeholder for multiple parameters, including something
// that contains row version information
void Customer.UpdateInformation(object data);
我需要能够在其他人更新他们正在处理的数据时告诉web应用程序的用户


我不希望从更改数据的方法返回值。所以在过去,我抛出了异常(类似于.NET数据适配器API,它在检测到冲突时抛出异常),但从某种常识上讲,并发冲突并不是异常的。它们是生活中的事实:是应用程序工作流程中可预测、可预期的一部分。在Eric Lippert的分类法中,它们是否符合条件?

在我看来,例外是传达此类错误的最佳方式。我认为您的解决方案是非常正确的,因为您抛出了一种特定类型的异常,您可以在表示层捕获它。表示层可以使用该异常中的信息向用户显示

虽然例外是最好的方法,但创建良好的用户体验可能非常困难。最简单的方法是告诉用户存在冲突,然后选择是要丢失更改还是要覆盖新更改。当您想要显示冲突或让用户选择覆盖哪些值和不覆盖哪些值时,这会变得很困难。或者至少,很难用通用的方法来实现这一点。对于可能发生冲突的系统中的每个屏幕,您可能需要一个特定的接口来解决此类冲突

在我工作的系统中,我们几乎没有捕捉到这些异常以显示给用户。我们主要是通过改变冲突背后的过程来防止这些冲突的发生。当然,这完全取决于您的应用程序类型和业务工作方式(或喜欢的工作方式),哪种解决方案最好