在将并发冲突传达给您的应用程序层时,是否有替代使用也尊重命令查询分离原则的异常,或者异常是我们拥有的最佳机制(在支持异常的语言中)?
在我的应用程序的内部,我有乐观的锁定逻辑,当我调用某些高级方法时,它会向下执行几层,例如(在我的情况下,我使用的是自定义数据访问层,尽管我当然愿意听听 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 的分类法中,它们是否有资格作为外生例外?