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