2013-08-27 3 views
0

Я понял, что с доменным дизайном объекты домена не сохраняются в моем приложении, а скорее создаются и удаляются по требованию.Как применить контроль версий на объектах домена

Я думаю, что это может привести к новой ситуации для моего приложения, где теперь я должен рассмотреть версию домена объекта домена, с которым я имею дело.

В мои старые времена я бы обновил, то есть имя пользователя, а затем, теперь, тем не менее, я получаю и сохраняю весь пользователь в качестве объекта после выполнения чего-то с ним, и я боюсь, что существует риск перезаписи изменений, которые другой пользователь сделанный на тот же объект.

Каков правильный способ решения этой проблемы? Простое поле версии в базе данных? Как бы вы тогда имели дело с ситуацией, когда пользователь пытается переписать?

Как я пишу это, я понимаю, что я, вероятно, имел подобные проблемы с моим старым приложением, но я как-то чувствую, что это больше проблемы при работе с объектами домена ...

+1

Похоже, ваше приложение может быть простым интерфейсом CRUD? В этом случае DDD не подходит вообще. В противном случае вам может понадобиться google «Event Sourcing». – MattDavey

+0

Почему существует параллельная проблема, если объекты созданы и работают по запросу? – Hippoom

ответ

1

Есть два варианта, как можно добиться обновления, см Optimistic vs. Pessimistic locking

Вы, наверное, говорить о оптимистичным блокировки которые достигают обновления с помощью номера версии. Принципал прост: ваше обновление просто надеется, что какой-то другой поток/пользователь не обновит строку (базу данных). Запрос должен содержать версию, которая соответствует (или не) целевой строке базы данных.

Этот подход увеличивает пропускную способность приложения (базы данных) в качестве второй возможной опции - пессимистическая блокировка - блокирует эту строку в базе данных, которая просто останавливает другой поток/клиент до момента совершения транзакции.

1

Поскольку этот вопрос был помечен с PHP, то Я предполагаю, что это не относится к DDD. В этом вопросе также рассматриваются проблемы параллелизма на уровне базы данных.

Вы можете добавить столбец номера версии в таблицу базы данных. Выполните свои обновления с помощью:

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

42, конечно, поставляется с любой версией, имевшейся у пользователя при запросе записи. Вставка будет успешной только в том случае, если номер версии не был изменен каким-либо другим запросом. Вам просто нужно проверить количество обновлений и бросить исключение, если счет равен 0.

Это обычная реализация так называемой оптимистической блокировки.

Некоторых системы PHP ORM, такие как доктрины 2 были построены в этом: http://docs.doctrine-project.org/en/latest/reference/transactions-and-concurrency.html

И снова я хочу подчеркнуть, что это проблема сохранения данных и не DDD. Я скорее сомневаюсь, если вы воспользуетесь этим свойством версии на уровне модели домена.

Смежные вопросы