Допустим, например, у меня есть приложение для заказа виджетов. Это позволяет клиентам делать заказ из каталога виджетов. Очевидными объектами выбора могут быть «Каталог» и «Заказы». Объект «Каталог» позволит мне просматривать, добавлять и удалять виджеты. Объект «Заказы» позволит мне создавать и обновлять заказы.
Они оба являются многопоточными и обрабатывают блокировку объектов и транзакции базы данных внутри. Они хорошо инкапсулированы / разделены - до тех пор, пока не появится требование о том, что при удалении виджета из каталога позиции, содержащие этот виджет, должны быть удалены из существующих заказов.
Распространенный способ справиться с этим сценарием - использовать шаблон наблюдателя. Другими словами, событие вызывается из «Каталога» при удалении детали. Затем посредник обрабатывает это событие и говорит «Заказы» удалить позиции с этим виджетом.
Плюсы: сохраняет герметизацию, слабое сцепление.
Минусы: не является ли удаление детали и обновление заказов единственной атомарной операцией? Эта техника будет нарушать это. Другими словами, если при обработке события произошла ошибка, деталь можно удалить без обновления каких-либо заказов.
Я предпочитаю минусы. Однако это может означать только то, что требуется другой объект - тот, который объединяет «Каталог» и «Заказы» и заставляет обе операции выполняться атомарно. Проблема заключается в том, что каждый объект выполняет блокировку объектов и транзакции базы данных, и я не вижу, как правильно извлечь их, т. Е. Теперь технически новый объект должен справиться с этой обязанностью, поскольку вы не можете блокировать объекты и выполнять транзакции дважды и при этом выполнять атомарную операцию. .
Мысли? Это классическая проблема, которую я не видел раньше? Я был на весенней дороге, но не думаю, что здесь можно что-то сделать.
Спасибо.