Php 如何对域对象应用版本控制

Php 如何对域对象应用版本控制,php,version-control,domain-driven-design,domain-object,Php,Version Control,Domain Driven Design,Domain Object,我逐渐了解到,使用域驱动设计,域对象不会持久存在于我的应用程序中,而是根据需要创建和删除 我想这可能会给我的应用程序带来新的情况,我现在必须考虑我正在处理的域对象的版本。 在我过去的日子里,我会随时更新用户名,但现在我会在对整个用户进行操作后将其作为一个对象进行获取和存储,我担心会有覆盖其他用户对同一对象所做更改的风险 处理这个问题的正确方法是什么?数据库中的一个简单版本字段?然后您将如何处理用户试图覆盖的情况 当我写这篇文章时,我意识到我的旧应用程序可能也有类似的问题,但我不知何故觉得在处理域

我逐渐了解到,使用域驱动设计,域对象不会持久存在于我的应用程序中,而是根据需要创建和删除

我想这可能会给我的应用程序带来新的情况,我现在必须考虑我正在处理的域对象的版本。 在我过去的日子里,我会随时更新用户名,但现在我会在对整个用户进行操作后将其作为一个对象进行获取和存储,我担心会有覆盖其他用户对同一对象所做更改的风险

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


当我写这篇文章时,我意识到我的旧应用程序可能也有类似的问题,但我不知何故觉得在处理域对象时这是一个更大的问题…

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

可以将版本号列添加到数据库表中。使用以下工具执行更新:

UPDATE user 
    SET name = 'Some new name', version = version + 1 
    WHERE id = 24 AND version = 42;
当然,42来自用户查询记录时的任何版本。只有当版本号没有被其他请求更改时,插入才会成功。您只需要检查更新计数,如果计数为0,则抛出一个异常

这是乐观锁定的常见实现

一些PHP Orm系统(如条令2)内置了以下功能:


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

有两种方法可以实现更新,请参阅

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


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

听起来您的应用程序可能是一个简单的CRUD接口?在这种情况下,DDD可能根本不合适。否则,你可能会想用谷歌搜索“事件源”。如果对象是按需创建和删除的,为什么会出现并发问题?