当将并发冲突与您的应用程序层进行交流时,是否有使用异常的替代方法 命令查询分离, ,或者是我们拥有的最佳机制(在支持异常的语言中)?

在我的应用程序的肠子里,我有乐观的锁定逻辑,当我调用某些高级方法时,可以执行几层,例如(在我的情况下,我使用的是自定义数据访问层,尽管我肯定会开放听取ORM实施方式)。高级方法调用了该应用程序与这样相互作用的相互作用:

// 'data' is just a placeholder for multiple parameters, including something
// that contains row version information
void Customer.UpdateInformation(object data);

当其他人更新正在处理的数据时,我需要能够告诉用户Web应用程序。

我宁愿不要从更改数据的方法中返回值。因此,在过去,我抛出了异常(类似于.NET数据适配器API,它抛出了一个 dbConcurrencyException 当它检测到冲突时),但是并发冲突并非以某种常识的方式出名。它们是生活的事实:应用程序工作流程中可预测的,预期的一部分。他们有资格 外源例外, ,在埃里克·利珀特(Eric Lippert)的分类学中?

有帮助吗?

解决方案

我认为例外是传达此类错误的最佳方法。我认为您的解决方案是正确的,因为您会提出一种特定的例外,可以在演示层上捕获。演示层可以使用该例外的信息向用户显示。

虽然例外是最好的方法,但创建不错的用户体验可能非常困难。最简单的事情是告诉用户存在冲突,然后选择他想失去更改或喜欢覆盖新更改。当您要显示冲突或让用户选择要覆盖的值而不是哪些值时,它会变得困难。或者至少,很难以通用的方式执行此操作。您可能需要一个特定的接口来解决可能发生冲突的系统中的每个屏幕。

在我处理的系统中,我们几乎没有捕获这些例外,以向用户显示。我们主要试图通过更改其背后的过程来防止这些冲突发生。当然,这完全取决于您的应用程序类型以及业务的运作方式(或喜欢工作)最好的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top