在使用 DDD 开发 Web 应用程序时,确保聚合的一致性非常重要。
我过去在 Web 应用程序(没有 DDD)上工作,我们试图使用事务来确保数据的一致性。所以,我们使用了可序列化的事务级别,这对我们的团队来说是一场噩梦,因为我们的应用程序的性能非常糟糕并且我们的用户报告了很多死锁问题。
现在我正在开发一个实现 DDD 原则的 Web 应用程序,我需要确保我们的聚合的一致性。
我在这里读到 http://geekswithblogs.net/Optikal/archive/2013/04/07/152643.aspx 乐观并发/锁定是实现抛出将版本或时间戳分配给我们的聚合以检查它的方法之一。
我的第一个问题是如何使用 C# 和 Entity Framework 结合 Sql Server 实现乐观并发,包括从开始到结束的整个过程,以及如果我们采用 Eric Evans 给出的订单和行项目示例,该列/标志的存储位置在他的书里吗?
我的第二个问题是在竞争条件下用于确保聚合一致性的常用策略是什么?
我将不胜感激任何代码片段或引用。
最佳答案
如果您使用单个表来存储整个聚合,那么您可以使用乐观锁。例如,您可以使用 JSON column to store 行项目。对于这种情况,基于文档的 NoSQL 数据库非常适合。
如果您使用多个表(即一张表用于订单,一张表用于行项目),那么我看不出您如何可靠地使用乐观锁定来确保原子性。在这种情况下,您需要交易。
你只是 retry the command 。如果您将聚合设计为无副作用(至少不进行任何 IO 调用),那么这应该不是问题。
关于c# - 如何证明 DDD 中聚合的一致性(技术上)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46411649/