0

我已经了解到,通过域驱动设计,域对象不会保留在我的应用程序中,而是根据需要创建和删除。

我认为这可能会导致我的应用程序出现新情况,我现在必须考虑我正在处理的域对象的版本。

在我过去的日子里,我会在那里更新用户名,然后,现在我在对其进行操作后将整个用户获取并存储为一个对象,我担心存在覆盖另一个用户对相同的更改所做的更改的风险目的。

处理这个问题的正确方法是什么?数据库中的简单版本字段?然后,您将如何处理用户尝试覆盖的情况?

当我写这篇文章时,我意识到我的旧应用程序可能有类似的问题,但我觉得在处理域对象时它更像是一个问题......

4

2 回答 2

1

有两种方法可以实现更新,请参阅乐观与悲观锁定

您可能会谈论使用版本号实现更新的乐观锁定。原则很简单:您的更新只是希望其他线程/用户不要更新相同的(数据库)行。查询必须包含匹配(或不匹配)目标数据库行的版本。

这种方法增加了应用程序(数据库)的吞吐量作为您的第二个可能选项 - 悲观锁定 - 将这一行锁定在数据库中,这只会停止其他线程/客户端,直到事务提交。

于 2013-08-28T11:38:10.370 回答
1

由于这个问题是用 php 标记的,所以我假设它不是特定于 DDD。该问题还涉及数据库级别的并发问题。

您可以将版本号列添加到数据库表中。执行更新:

UPDATE user 
    SET name = 'Some new name', version = version + 1 
    WHERE id = 24 AND version = 42;

42 当然来自您查询记录时用户拥有的任何版本。仅当版本号未被其他请求更改时,插入才会成功。您只需要检查更新计数并在计数为 0 时抛出异常。

这是所谓的乐观锁定的常见实现。

一些 PHP Orm 系统,例如 Doctrine 2,内置了这个:http: //docs.doctrine-project.org/en/latest/reference/transactions-and-concurrency.html

我想再次强调这是一个数据持久性问题,而不是 DDD。我相当怀疑您是否会在域模型级别使用此版本属性。

于 2013-08-27T15:33:36.070 回答