如何在域对象上应用版本控制

时间:2013-08-27 11:03:55

标签: php version-control domain-driven-design domain-object

我已经明白,使用域驱动设计,域对象不会在我的应用程序中持久存在,而是根据需要创建和删除。

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

在我过去,我会更新ie那里的用户名然后,现在我在使用它之后获取并将整个用户存储为对象,我担心有覆盖其他用户所做的更改的风险同一个对象。

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

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

2 个答案:

答案 0 :(得分: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。我很怀疑你是否会在域模型级别使用这个版本属性。

答案 1 :(得分:1)

有两种方法可以实现更新,请参阅Optimistic vs. Pessimistic locking

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

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