【发布时间】:2018-03-21 16:55:11
【问题描述】:
从理论上讲,如果我们在聚合根级别实现乐观并发(AR 中的更改实体会更改 AR 上的版本)并假设我们使用时间戳作为版本属性(只是为了简单起见) - 时间线应该是 AR 上的属性还是应该它一方面是读取模型的一部分,另一方面(例如更新)是应用程序服务的单独参数,例如:
[伪]
public class AppService{
.
.
.
public void UpdateSomething(UpdateModelDTO model, int timestamp)
{
repository.GetModel(model.Identifier);
model.UpdateSomething(model.something);
repository.ConcurrencySafeModelUpdate(model, timestamp);
}
}
我看到了两者的优点/缺点,但想知道哪个是按部就班的解决方案?
[更新]
为了回答@guillaume31 的问题,我期待通常的情况:
- 读取时,版本标识符被读取并发送到客户端
- 更新时,客户端发回标识符,如果版本标识符不同,存储库会返回某种错误。
我不知道它是否重要,但我想将创建/更新版本标识符的责任留给我的数据库系统。
【问题讨论】:
-
我不确定我是否理解您的问题。你是在问聚合是否应该知道/关心那个 ts/version 属性/列/属性?
-
是的,这就是我要问的。
-
并发数据访问在某种程度上与 DDD 正交,所以:没有按书本的解决方案。您能否更具体地说明您对应用程序级乐观并发的期望?你希望它解决什么问题?
-
@guillaume31 感谢您的提问!我已经更新了我最初的帖子。