我已经明白,通过域驱动的设计,域对象不会持久存在于我的应用程序中,而是根据需要创建和丢弃的。
我认为这可能会给我的应用程序带来一种新的情况,我现在必须考虑我正在处理的域对象的版本。
在我以前的日子里,我会不时更新用户名,但现在我在对整个用户进行操作后,将其作为一个对象进行获取和存储,我担心会有覆盖另一个用户对同一对象所做更改的风险。
处理此问题的正确方法是什么?数据库中的一个简单版本字段然后,您将如何处理用户试图覆盖的情况?
当我写这篇文章的时候,我意识到我的旧应用程序可能也有类似的问题,但不知何故,我觉得在处理域对象时,这更像是一个问题。。。
有两个选项可以实现更新,请参阅乐观与悲观锁定
您可能会谈论乐观锁定,它使用版本号实现更新。原理很简单:您的更新只是希望其他线程/用户不要更新同一行(数据库)。查询必须包含与目标数据库行匹配(或不匹配)的版本。
这种方法增加了应用程序(数据库)的吞吐量,因为您的第二个可能选项——悲观锁定——将此行锁定在数据库中,这只会停止其他线程/客户端,直到事务提交。
由于这个问题是用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。我很怀疑您是否会在域模型级别使用此版本属性。