460 Часть II. Типовые решения
различные части агрегата могут оказаться несогласованными. Разумеется, это очень
и очень плохо.
Обратите внимание, что общая блокировка может применяться и для блокирования
агрегата, поскольку блокирование любого объекта агрегата автоматически заблокирует
корневой элемент.
Обе реализации блокировки с низкой степенью детализации — в виде общей блокиров-
ки или же блокировки корневого элемента — имеют как преимущества, так и недостатки.
Применение общей блокировки к записям реляционной базы данных требует выполне-
ния соединений с таблицей версий в каждом операторе SELECT. В свою очередь, после-
довательная загрузка объектов при перемещении к корневому элементу также может
привести к падению производительности. Вообще говоря, сочетание блокировки корне-
вого элемента и пессимистической автономной блокировки удачным не назовешь. К тому
времени как вы загрузите все необходимые объекты и доберетесь до корневого элемента,
вам может понадобиться перезагрузить несколько объектов, чтобы гарантировать нали-
чие последних версий. И наконец, большие ограничения на выбор реализации наклады-
вает построение системы для работы с существующим источником данных. Сколько бы
ни было вариантов реализации, тонкостей их применения еще больше. Убедитесь, что
выбранная реализация в точности соответствует потребностям вашего приложения.
Назначение
В большинстве случаев блокировка с низкой степенью детализации применяется для
удовлетворения бизнес-требований. Это особенно справедливо при блокировании агре-
гатов. Представьте себе объект, содержащий коллекцию предметов имущества, сдавае-
мых в аренду. Скорее всего, вам не захочется допускать ситуации, когда один пользова-
тель редактирует объект аренды, а другой — один из предметов имущества, входящих
в коллекцию. Поэтому блокирование объекта аренды или одного из предметов имущест-
ва должно приводить к блокированию объекта аренды и всех предметов имущества, вхо-
дящих в его коллекцию.
Огромным преимуществом использования блокировки с низкой степенью детализации
является относительная дешевизна наложения и снятия блокировки, что, несомненно,
служит серьезным аргументом в пользу данного типового решения. Общая блокировка
может быть применена и к концепции агрегата [15]. Следует, однако, быть осторожным,
используя данную схему блокирования для удовлетворения нефункциональных требова-
ний, например повышения производительности. Кроме того, реализация блокировки
с низкой степенью детализации может привести к неестественным отношениям между
объектами.
Пример: общая оптимистическая автономная блокировка (Java)
В данном примере воспользуемся моделью домена с супертипом слоя (Layer Super-
type, 491) и преобразователями данных (Data Mapper, 187). В качестве постоянного храни-
лища данных будет выступать реляционная база данных.
Вначале нужно создать класс и таблицу для работы с номерами версий. Для простоты
создадим достаточно обширный класс Version, который будет содержать в себе не толь-
ко значение номера версии, но и статический метод поиска. Обратите внимание, что для
кэширования объектов версий, применяемых в текущем сеансе, будет использоваться