Как применить контроль версий на объектах домена

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

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

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

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

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

2 ответа

Решение

Существует два варианта получения обновлений: см. Оптимистическая и пессимистическая блокировки.

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

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

Поскольку этот вопрос был помечен с помощью 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. Я скорее сомневаюсь, если бы вы использовали это свойство версии на уровне модели домена.

Другие вопросы по тегам