Любая обработка финансовой информации будет вращаться вокруг одного ключевого аспекта - тщательного управления статусом.
Попробуйте создать модель состояний для вашей системы контрактов и тщательно задокументируйте, какие состояния могут быть достигнуты из данного состояния, и какая обработка должна выполняться, чтобы перейти из одного действительного состояния в другое действительное состояние. Затем убедитесь, что любой переход из одного состояния в другое происходит в транзакции, так что при невозможности достижения следующего состояния контракт возвращается в его предыдущее состояние.
Вы можете обнаружить, что вам будет легче, если вы детализируете свои состояния, чтобы отразить текущую обработку - то есть вместо того, чтобы REVIEWED, RENEWED, APPROVED, REJECTED, FUNDED, также имеют состояния, которые установлены, чтобы указать, что контракт находится в состояние потока - то есть он сейчас пересматривается, сейчас финансируется и т. д. Таким образом, система может идентифицировать контракты, которые сейчас активно обрабатываются. Это также позволяет легко определить, что происходило в случае внезапного сбоя среды без успешного отката.
Убедитесь, что у вас есть только одна служба, которая обновляет состояние контракта, и что эта служба блокирует контракт во время обновления. Все остальные процессы будут использовать эту службу для выполнения необходимых изменений статуса.
Таким образом, в вашем конкретном случае UpdateFundApprovalDate (фонд FundDTO) будет запускаться только для контрактов, статус которых был PENDING_FUNDING, и, вероятно, будет только частью общей обработки - в любом случае, когда процесс, выполняющий ваше updateFundApprovalDate (Фонд FundDTO) завершается, статус контракта будет либо ФИНАНСИРОВАН, если он был успешным, либо, если попытка финансирования не удалась, все изменения будут отменены, что приведет к исходному статусу контракта PENDING_FUNDING. Если система выйдет из строя, статус контракта может быть потенциально оставлен в текущем состоянии обработки, имеющем состояние, похожее на FUNDING. Само ФИНАНСИРОВАНИЕ не будет действительным состоянием в вашей модели состояний - это промежуточное состояние. Все процессы начнут обрабатывать контракт только в действительном состоянии, а не в промежуточных.
Для шаблонов, которые могут использоваться в этой ситуации, посмотрите шаблоны State Machine.