Этот вопрос выдвигает на первый план важные различия между надлежащим использованием обработки исключений, транзакций и идеей рабочего процесса "компенсация" , к которой стремится получить спрашивающий, при правильном указании:
Это похоже на проблему, которая возникает во многих приложениях, и должен быть чистый способ ее решения.
Это распространенная проблема, сначала некоторые сведения о транзакционном подходе, который вы сейчас используете:
Операции с данными первоначально моделировались после учета двойной записи - один кредит и соответствующий дебет должны были регистрироваться вместе или не регистрироваться вообще. По мере того, как транзакции становятся больше, они становятся все более проблематичными для правильного осуществления, и становится все труднее справляться с ошибками. Когда вы начинаете распространять идею об одной транзакции через системные границы, вы, скорее всего, ошибаетесь. Это может быть сделано, но требует сложных и обязательно координаторов транзакций с более высокой задержкой. В определенном масштабе транзакции - это неправильное мышление, и компенсация начинает иметь гораздо больший смысл.
Это то место, куда вы возвращаетесь и смотрите, что на самом деле делает бизнес. Одна большая транзакция, скорее всего, не так, как это видят деловые люди. Обычно они видят выполненный шаг, и в зависимости от последующих результатов могут потребоваться различные действия для компенсации. Вот где приходит идея рабочего процесса и компенсации . Вот одно введение в эти понятия
Например, если вы заказываете книгу у Amazon, они, вероятно, не "блокируют" запись, когда она находится в вашей корзине, или даже используют строгие транзакции, чтобы определить, есть ли книга в наличии на момент заказа. подтверждено. Они все равно продадут его вам и отправят, когда смогут. Если им не удалось получить его в наличии в течение нескольких недель, они, вероятно, отправят вам электронное письмо с сообщением о том, что они пытаются удовлетворить ваши потребности, и вы можете продолжать ждать, пока они получат его в наличии, или вы можете отменить ваш заказ. Это называется компенсацией и необходимо во многих реальных бизнес-процессах.
Наконец, ничего исключительного ни о чем этом не говорит. Ожидайте, что это может произойти, и используйте нормальный поток управления. Вам не следует здесь использовать функции обработки исключений в вашем языке ( хорошие правила, когда следует выдавать исключение ). Также не следует полагаться на механизмы, специфичные для инструментов (WCF?), Для просмотра или обработки исключений, возникающих в реализации службы. Сообщение о сбоях должно быть обычной частью вашего контракта на данные (контракты о сбоях).
К сожалению, благодаря «чистому способу обработки» нет установленного флага, который волшебным образом позаботится об этом, вы должны продолжать разбивать проблему и разбираться со всеми полученными частями. Надеемся, что эти концепции свяжут вас с тем, что сделали другие люди, когда имели дело с этой проблемой.
Резюме:
- Ваша проблема переросла концепцию транзакции -> посмотрите на компенсацию рабочего процесса.
Удачи -